js递归遍历树,查找符合条件的子属性

12,781 阅读1分钟

数据源格式:

const list = [
  {
    "value": 192,
    "label": "技术部",
    "children": [
      {
        "value": 193,
        "label": "软件组",
        "children": [
          {
            "value": 195,
            "label": "软件一组"
          },
          {
            "value": 196,
            "label": "软件二组"
          }
        ]
      },
      {
        "value": 198,
        "label": "运维组"
      }
    ]
  },
  {
    "value": 200,
    "label": "财务部",
    "children": [
      {
        "value": 201,
        "label": "会计"
      },
      {
        "value": 203,
        "label": "出纳"
      }
    ]
  },
  {
    "value": 300,
    "label": "人资部",
    "children": [
      {
        "value": 301,
        "label": "行政"
      },
      {
        "value": 302,
        "label": "人资"
      }
    ]
  }
]

目的

假设给定一个id = 301,查找出 listvalue = id的对象,并取出对应的label值。

分析

list 是一个嵌套的json数据,每一级都可能存在children属性,children中包含跟父级相同的数据结构,如果用嵌套for循环来实现,代码冗长不易阅读,而且性能也不好,所以我们选择使用递归算法来实现。

代码

/**
* 递归函数
* @param setValues 树型数据
* @param valueId 查找的id
*/
function recursionGet(setValues, valueId) {
  let value = null;
  for (let index = 0; index < setValues.length; index += 1) {
    if (setValues[index].value === valueId) {
      value = setValues[index].label;
      break;
    }
    if (setValues[index].children instanceof Array && setValues[index].children.length > 0) {
      const text = recursionGet(setValues[index].children, valueId);
      if (text)
        return text;
    }
  }
  return value;
}


// 调用
const data =recursionGet(list,301)
console.log(data) // 输出 行政

注意