添加属性
给数据每一级添加一个叠加属性值。例如:level=1(省),level=2(市),level=3(区)。
//cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js/*** @description: 给每一级添加level属性,level随着层级,加1* @param {Array} data 城市数组* @param {Number} level 需要插入的属性值(这里列举的属性名称是level)* @return {Array}最终的执行完的值*/function arrAddAttr(data, level = 1) {if (data && data.length == 0) return true;data.forEach((item) => {item.level = level;if(item.children && item.children.length > 0) {arrAddAttr(item.children, level + 1)}})return data;}//arrAddAttr(cityList, 1)//expected output: [{label: '安徽省',value: '2', level: 1, children: [{label: '安庆市', value: '36', level: 2}]}]
过滤属性
根据需要的等级,过滤出数据,例如:省;省、市;省、市、区。
//cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js/*** @description: 过滤出想要的数据,例如省;省、市;省、市、区;* @param {Array} data 城市数组* @param {Number} level 需要插入的属性以及值,比如1就是获取省,2就是获取省、市,3就是获取省、市、区* @return {Array}最终的执行完的值*/let arrSize = arrLength(data);function arrFilter(data, level=3) {if(level === 1) {return data.reduce((acc, item) => {acc.push({value: item.value,label: item.label})return acc;},[])}else if(level > 1 && level < arrSize) {return data.reduce((acc, item) => {if(item.children && item.children.length > 0) {let node = arrFilter(item.children, level);if(node) {acc.push({value: item.value,label: item.label,children: node})}}return acc;},[])}else {return data;}}//父子级的总长度function arrLength(data, len = 1) {for(var item of data) {if(item.children) {len++let node = arrLength(item.children, len);if(node) {return node;}}else {return len;}}}//arrFilter(cityList, 2)//expected output: [{label: '安徽省',value: '2', children: [{label: '安庆市', value: '36', children: []}]}]
获取属性值
根据需要查询的属性,来获取对应的值(Object)
//cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js/*** @description: 根据需要查询的属性,来获取对应的值* @param {Array} data* @param {String} label* @return {Object} 包含了label在类的值,如果有children,也会一并返回*/function arrGetValue(data, label) {for(const item of data) {if(item.label === label) {return item;}if(item.children && item.children.length > 0) {const _item = this.arrGetValue(item.children, label)if(_item) return _item;}}}//arrGetValue(cityList, '芜湖市')//expected output: {value: '50', label: '芜湖市', children: Array(8)}//arrGetValue(cityList, '三山区')//expected output: {value: '3688', label: '三山区'}
获取所有父节点对象
根据需要查询的id,来获取所有父节点对象
//cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js/*** @description: 根据需要查询的id,来获取所有父节点对象* @param {Array} data* @param {String} id* @return {Array}返回所有父节点对象数组*/function arrFilterValue(data, id) {for(var i in data) {if(data[i].value === id) {return [data[i]]}if(data[i].children && data[i].children.length > 0) {let node = arrFilterValue(data[i].children,id);if (node) {return node.concat(data[i])}}}}//arrFilterValue(cityList, '50')//expected output: [{value: '50', label: '芜湖市', children: Array(8)}, {value: '20', label: '安徽省', children: Array(16)}]//arrFilterValue(cityList, '3690')//expected output: [{value: '3690', label: '鸠江区'}, {value: '50', label: '芜湖市', children: Array(8)}, {value: '20', label: '安徽省', children: Array(16)}]
