javascript - 通过属性比较对象数组,然后将新对象附加到数组中:Javascript
问题描述
我有两个对象数组,其中name
需要比较这些对象并获取值并将其附加到数组之一。我能够在第一级做到这一点,我怎样才能递归地实现相同的目标并更新对象。
const arr1 = [
{
name: "internalcorp.com",
children: [
{
name: "internalcorp.com.child1",
children: [
{
name: "internalcorp.com.grandchild1",
children: []
},
{
name: "internalcorp.com.grandchild2",
children: []
}
]
},
{
name: "internalcorp.com.child2",
children: []
}
]
},
{
name: "internalcorpwebsite.com",
children: [
{
name: "internalcorpwebsite.com.child1",
children: []
}
]
}
];
const arr2 = [
{
name: "internalcorp.com",
val1: false,
val2: false
},
{
name: "internalcorp.com.child1",
val1: true,
val2: true
},
{
name: "internalcorp.com.grandchild1",
val1: true,
val2: true
},
{
name: "internalcorp.com.grandchild2",
val1: false,
val2: true
},
{
name: "internalcorp.com.child2",
val1: true,
val2: false
},
{
name: "internalcorpwebsite.com",
val1: false,
val2: false
},
{
name: "internalcorpwebsite.com.child1",
val1: false,
val2: false
}
];
输出应该看起来像
const res = [
{
name: "internalcorp.com",
config: {
val1: false,
val2: false
},
children: [
{
name: "internalcorp.com.child1",
config: {
val1: true,
val2: true
},
children: [
{
name: "internalcorp.com.grandchild1",
config: {
val1: true,
val2: true
},
children: []
},
{
name: "internalcorp.com.grandchild2",
config: {
val1: false,
val2: true
},
children: []
}
]
},
{
name: "internalcorp.com.child2",
config: {
val1: true,
val2: false
},
children: []
}
]
},
{
name: "internalcorpwebsite.com",
children: [
{
name: "internalcorpwebsite.com.child1",
className: "level-1 leaf",
children: [],
val1: false,
val2: false
}
],
config: {
val1: false,
val2: false
}
}
];
我试过的代码
const result = arr1.map((item) => {
let config = arr2.find((p) => p.name === item.name);
return {
...item,
config: {
val1: config.val1,
val2: config.val2
}
};
});
解决方案
你很接近了怎么办:
- 将您包装
.map()
在一个命名函数中,以便可以递归调用它(我去了addConfig
) - 在 的返回对象中
.map()
,添加键/值对children: addConfig(item.children)
这样就行了。
const arr1 = [
{
name: "internalcorp.com",
children: [
{
name: "internalcorp.com.child1",
children: [
{
name: "internalcorp.com.grandchild1",
children: []
},
{
name: "internalcorp.com.grandchild2",
children: []
}
]
},
{
name: "internalcorp.com.child2",
children: []
}
]
},
{
name: "internalcorpwebsite.com",
children: [
{
name: "internalcorpwebsite.com.child1",
children: []
}
]
}
];
const arr2 = [
{
name: "internalcorp.com",
val1: false,
val2: false
},
{
name: "internalcorp.com.child1",
val1: true,
val2: true
},
{
name: "internalcorp.com.grandchild1",
val1: true,
val2: true
},
{
name: "internalcorp.com.grandchild2",
val1: false,
val2: true
},
{
name: "internalcorp.com.child2",
val1: true,
val2: false
},
{
name: "internalcorpwebsite.com",
val1: false,
val2: false
},
{
name: "internalcorpwebsite.com.child1",
val1: false,
val2: false
}
];
const addConfig = (items) =>
items.map(item => {
const { val1, val2 } = arr2.find(p => p.name === item.name);
return {
...item,
config: {
val1,
val2
},
children: addConfig(item.children)
};
});
const result = addConfig(arr1);
console.log(result);
推荐阅读
- qml - 你可以设置一个预定的计费应用程序qt吗?
- java - 解析headers信息并在bean中设置
- spring-integration - ServiceActivator 没有收到来自 ImapIdleChannelAdapter 的消息
- grid - VTK - 非结构化网格:更改点/标记点的顺序
- ignite - Apache ignite 节点无法加入网格
- javascript - 如何从 Codepen 中的 NPM 包中导入 Vue 组件?
- html - 背景图像未设置为全高
- ionic3 - 找不到 play-services-auth-base-license.aar (com.google.android.gms:play-services-auth-base-license:11.8.0)
- mysql - 如何在 codeigniter 集成 tinymce 以进行本地图像上传
- javascript - 在横幅 css 动画上滑动文本