javascipt: 多维数组对象扁平化?

const arr = [{ id: 1, children: [{ id: 11, children: [{ id: 111 }, { id: 112 }] }, { id: 12 }] },
{ id: 2, children: [{ id: 21, children: [{ id: 211 }, { id: 212 }] }, { id: 22 }] }];

希望得到所有的id集合:
[1,11,111,112,22,2,21,211,212,22]

请教下大家有好的实现方法吗?

阅读 2.1k
3 个回答
function getAllIds(arr) {
  const ids = [];
  arr.forEach(item => {
    ids.push(item.id);
    if (item.children) {
      ids.push(...getAllIds(item.children));
    }
  });
  return ids;
}

const arr = [{ id: 1, children: [{ id: 11, children: [{ id: 111 }, { id: 112 }] }, { id: 12 }] },
{ id: 2, children: [{ id: 21, children: [{ id: 211 }, { id: 212 }] }, { id: 22 }] }];

const ids = getAllIds(arr);
console.log(ids); // [1, 11, 111, 112, 12, 2, 21, 211, 212, 22]

经典的多叉树遍历
所以多刷算法还是有用的

const arr = [{ id: 1, children: [{ id: 11, children: [{ id: 111 }, { id: 112 }] }, { id: 12 }] },
{ id: 2, children: [{ id: 21, children: [{ id: 211 }, { id: 212 }] }, { id: 22 }] }];


const root={
  id:'root',
  children:arr
}


let result = [];     
function traverseTree(node) {
  if (!node) {
    return;
  }
  if(node.id!=='root')
    result.push(node.id)
  if (node.children && node.children.length > 0) {
    node.children.map(item => this.traverseTree(item))
  }
  return result
}

traverseTree(root)

console.log(result) //[1, 11, 111, 112, 12, 2, 21, 211, 212, 22]

image.png
入参做出参

let treeToArr=(arr,res)=>{
    arr.forEach(item=>{
        res.push(item.id);
        treeToArr(item.children||[], res);
    })
}
let ids=[];
treeToArr(arr,ids);
console.log(ids)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏