js树结构数据递归获取name属性

各位大佬,针对这个问题我是这么写的代码?请问有没有什么问题?
一般你们会怎么写更好

    let obj = {
        name:'a',
        child:[{
            name:'b',
            child:[{
                name:'c',
                child:[]
            },{
                name:'d',
                child:[]
            },{
            name:'b1',
            child:[{
                name:'c2',
                    child:[]
                },{
                    name:'d3',
                    child:[]
                }]
            }]
        }]
    }
    
    
    function getName(obj){
        let arr = [];
        getData(obj)
        function getData(obj) {
            if (Object.prototype.toString.call(obj) == '[object Object]') {
                arr.push(obj.name)
                if (obj.child.length) {
                    getData(obj.child)
                }
            } else if (Object.prototype.toString.call(obj) == '[object Array]') {
                obj.forEach((item)=>{
                    arr.push(item.name)
                    if (item.child.length) {
                        getData(item.child)
                    }
                })
            }
            
            return arr;
        }
        return arr;
    }
    console.log(getName(obj))
阅读 5.4k
6 个回答
function getName(obj){
  let arr = []
  if(obj.child.length > 0) {
    arr.push(obj.name)  
    obj.child.forEach(item => {
      let childArr = getName(item)          
      arr.push(...childArr)
    })
  } else {
     arr.push(obj.name)
  }
  return arr
}

仅对于这道题

JSON.stringify(obj).match(/(?<="name":").+?(?=")/g);

如果无所谓结果顺序,建议广度优先。

const getKeysOfTree = (key, tree) => [ tree[key], tree.child?.map(subtree => getKeysOfTree(key, subtree)) ].flat(2)

ES6语法

function getNames(obj) {
    let flat = _arrs => _arrs.flatMap(item => [item,...flat(item.child)])
    return flat([obj]).map(item => item.name)
}
function collectName(target, key = 'name') {
  const result = [];

  function loop(arr, result) {
    arr.forEach((item) => {
      item[key] && result.push(item[key]);
      item.child && loop(item.child, result);
    });
  }

  loop([target], result);

  return result;
}

1.你这么写没问题
2.一般我会封装一个方法

function map(list, cb) {
    return list.reduce((res, v) => {
        res.push(cb(v));
        if(Array.isArray(v.child)) res = res.concat(map(v.child, cb))
        return res;
    }, []);
}
var obj = {
        name:'a',
        child:[{
            name:'b',
            child:[{
                name:'c',
                child:[]
            },{
                name:'d',
                child:[]
            },{
            name:'b1',
            child:[{
                name:'c2',
                    child:[]
                },{
                    name:'d3',
                    child:[]
                }]
            }]
        }]
    }
console.log(map([obj], v => v.name))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题