你不知道的js递归技巧

递归找对应的节点

要求以下输入一个id, 找出对应的id所对应的结构工具

var arr =[
    {id: 1,children: []},
    {id: 2,children: []},
    {id: 3,children: []},
    {id: 4,children: []},
    {id: 5,children: []},
    {
      id: 6,
      children: [
        {
          id: 7,
          children: [{id: 9, children:[]}]
        },{
          id: 8,
          children: []
        }
      ]
    },
  ];
  
  
  方法以下: 
  function digui(arr, id) {
    for(let i = 0; i< arr.length; i++) {
      if(arr[i].id === id){
        return arr[i]
      } else {
        if(arr[i].children.length !== 0){
          return digui(arr[i].children, id)
        }
      }
    }
  }
  
console.log(digui(arr, 9));   //{id: 9, children:[]}
console.log(digui(arr, 6));   
// 结果: 
// {
// id: 6,
// children: [
// {
// id: 7,
// children: [{id: 9, children:[]}]
// },{
// id: 8,
// children: []
// }
// ]
// }
复制代码

递归找到没有children的全部子节点name

var data = [
    {
      name: "全部物品",
      children: [
        {
          name: "水果",
          children: [{name: "苹果", children: [{name: '青苹果',children: [{name: '北方米饭'}, {name: '南方米饭'}]}, {name: '红苹果'}]}]
        },
        {
          name: '主食',
          children: [
            {name: "米饭"}
          ]
        },
        {
          name: '生活用品',
          children: [
            {name: "电脑类", children: [{name: '联想电脑'}, {name: '苹果电脑'}]},
            {name: "工具类", children: [{name: "锄头"}, {name: "锤子"}]},
            {name: "生活用品", children: [{name: "洗发水"}, {name: "沐浴露"}]}
          ]
        }
      ]
    }]
    
    function didui(arr) {
      let arrList = ''
      function f(arr) {
        arr.forEach(item => {
          if(item.children) {
            arguments.callee(item.children)
          } else {
            arrList += item.name + ';';
          }
        })
      }
      f(arr)
      return arrList;
    }

  console.log(didui(data));  //北方米饭;南方米饭;红苹果;米饭;联想电脑;苹果电脑;锄头;锤子;洗发水;沐浴露;

复制代码