首页 > 解决方案 > 我有一个平面对象数组,我想将它与对象的子数组合并

问题描述

我想从这里合并两个带有父 ID 的数组

//parent table 
const parent = [{ pid: 1, pname: 'jack' }, { pid: 2, pname: 'jhon' }]

和这个

//child table 
const child = [ 
  { cid: 1, cname: 'zhina', pid: 1 },
  { cid: 2, cname: 'mandy', pid: 1 },
  { cid: 3, cname: 'henry', pid: 2 },
  { cid: 4, cname: 'jhonny', pid: 2 }
]

这种方法=>

//nested table 
nested = [{
    pid: 1,
    pname: 'jack',
    children: [
      { cid: 1, cname: 'zhina', pid: 1 },
      { cid: 2, cname: 'mandy', pid: 1 }
    ]
  },
  {
    pid: 2,
    pname: 'jhon',
    children: [
      { cid: 3, cname: 'henry', pid: 2 },
      { cid: 4, cname: 'jhonny', pid: 2 }
    ]
  }
]

我不知道减少或对象键或对象分配会更好......我对此表示怀疑..我很高兴告诉我这样做的最佳方法thnxxxxx

标签: javascriptarraysobjectnestedhierarchy

解决方案


用于Array.reduce()迭代child数组。累加器的初始状态是数组的 Map parent,其中包含具有空子数组的对象。对于每个孩子,如果父亲存在于 Map 中,则取父母,并将孩子推送到children数组中:

const parent = [{pid:1 , pname : 'jack'} , {pid:2 , pname:'jhon'}]
const child = [{"cid":1,"cname":"zhina","pid":1},{"cid":2,"cname":"mandy","pid":1},{"cid":3,"cname":"henry","pid":2},{"cid":4,"cname":"jhonny","pid":2}]

const result = Array.from(child.reduce(
  (r, o) => {
    if(r.has(o.pid)) r.get(o.pid).children.push(o)
    
    return r
  },
  new Map(parent.map(o => [o.pid, { ...o, children: [] }]))
).values())

console.log(result)


推荐阅读