javascript - 我有一个平面对象数组,我想将它与对象的子数组合并
问题描述
我想从这里合并两个带有父 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
解决方案
用于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)
推荐阅读
- javascript - 如何使滚动条在某个时间后自动移动(JavaScript)
- haskell - 如何理解/使用 Haskell 修复功能
- .net - OdbcDataReader 限制
- javascript - Microsoft-Edge 添加随机溢出,而其他浏览器没有 (SVG)
- amazon-web-services - CloudFormation - 将标签应用于其他 AWS 资源
- phonegap - 用framework7最新版本创建phonegap应用
- maven - 无法在 Eclipse(氧气)中创建 Maven 项目
- javascript - 悬停时淡入背景图像
- reactjs - Symfony4 后端与前端反应。传递信息的最佳和最安全的方式?
- apache-kafka - 如何转换来自 KSQL 的响应 - UDF 返回 JSON 数组到列