添加属性

给数据每一级添加一个叠加属性值。例如:level=1(省),level=2(市),level=3(区)。

  1. //cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js
  2. /**
  3. * @description: 给每一级添加level属性,level随着层级,加1
  4. * @param {Array} data 城市数组
  5. * @param {Number} level 需要插入的属性值(这里列举的属性名称是level)
  6. * @return {Array}最终的执行完的值
  7. */
  8. function arrAddAttr(data, level = 1) {
  9. if (data && data.length == 0) return true;
  10. data.forEach((item) => {
  11. item.level = level;
  12. if(item.children && item.children.length > 0) {
  13. arrAddAttr(item.children, level + 1)
  14. }
  15. })
  16. return data;
  17. }
  18. //arrAddAttr(cityList, 1)
  19. //expected output: [{label: '安徽省',value: '2', level: 1, children: [{label: '安庆市', value: '36', level: 2}]}]

过滤属性

根据需要的等级,过滤出数据,例如:省;省、市;省、市、区。

  1. //cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js
  2. /**
  3. * @description: 过滤出想要的数据,例如省;省、市;省、市、区;
  4. * @param {Array} data 城市数组
  5. * @param {Number} level 需要插入的属性以及值,比如1就是获取省,2就是获取省、市,3就是获取省、市、区
  6. * @return {Array}最终的执行完的值
  7. */
  8. let arrSize = arrLength(data);
  9. function arrFilter(data, level=3) {
  10. if(level === 1) {
  11. return data.reduce((acc, item) => {
  12. acc.push({
  13. value: item.value,
  14. label: item.label
  15. })
  16. return acc;
  17. },[])
  18. }
  19. else if(level > 1 && level < arrSize) {
  20. return data.reduce((acc, item) => {
  21. if(item.children && item.children.length > 0) {
  22. let node = arrFilter(item.children, level);
  23. if(node) {
  24. acc.push({
  25. value: item.value,
  26. label: item.label,
  27. children: node
  28. })
  29. }
  30. }
  31. return acc;
  32. },[])
  33. }
  34. else {
  35. return data;
  36. }
  37. }
  38. //父子级的总长度
  39. function arrLength(data, len = 1) {
  40. for(var item of data) {
  41. if(item.children) {
  42. len++
  43. let node = arrLength(item.children, len);
  44. if(node) {
  45. return node;
  46. }
  47. }
  48. else {
  49. return len;
  50. }
  51. }
  52. }
  53. //arrFilter(cityList, 2)
  54. //expected output: [{label: '安徽省',value: '2', children: [{label: '安庆市', value: '36', children: []}]}]

获取属性值

根据需要查询的属性,来获取对应的值(Object)

  1. //cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js
  2. /**
  3. * @description: 根据需要查询的属性,来获取对应的值
  4. * @param {Array} data
  5. * @param {String} label
  6. * @return {Object} 包含了label在类的值,如果有children,也会一并返回
  7. */
  8. function arrGetValue(data, label) {
  9. for(const item of data) {
  10. if(item.label === label) {
  11. return item;
  12. }
  13. if(item.children && item.children.length > 0) {
  14. const _item = this.arrGetValue(item.children, label)
  15. if(_item) return _item;
  16. }
  17. }
  18. }
  19. //arrGetValue(cityList, '芜湖市')
  20. //expected output: {value: '50', label: '芜湖市', children: Array(8)}
  21. //arrGetValue(cityList, '三山区')
  22. //expected output: {value: '3688', label: '三山区'}

获取所有父节点对象

根据需要查询的id,来获取所有父节点对象

  1. //cityList(data) = https://file.40017.cn/zhuketong/zhuketong/data/cityList.js
  2. /**
  3. * @description: 根据需要查询的id,来获取所有父节点对象
  4. * @param {Array} data
  5. * @param {String} id
  6. * @return {Array}返回所有父节点对象数组
  7. */
  8. function arrFilterValue(data, id) {
  9. for(var i in data) {
  10. if(data[i].value === id) {
  11. return [data[i]]
  12. }
  13. if(data[i].children && data[i].children.length > 0) {
  14. let node = arrFilterValue(data[i].children,id);
  15. if (node) {
  16. return node.concat(data[i])
  17. }
  18. }
  19. }
  20. }
  21. //arrFilterValue(cityList, '50')
  22. //expected output: [{value: '50', label: '芜湖市', children: Array(8)}, {value: '20', label: '安徽省', children: Array(16)}]
  23. //arrFilterValue(cityList, '3690')
  24. //expected output: [{value: '3690', label: '鸠江区'}, {value: '50', label: '芜湖市', children: Array(8)}, {value: '20', label: '安徽省', children: Array(16)}]