我有两个对象数组,这些数组中的对象的键略有不同,但共享相同的 id。
我想做的是将这两个数组合并为一个数组,其中包含两个数组中的所有元素,且不重复。
数组一:
[
{id: 'ABC_123', value: 10, label: 'tree', level: 'mid'},
{id: 'ABC_456', value: 11, label: 'grass', level: 'top'}
];
数组二:
[
{levelId: 'ABC_123', value: 10, label: 'tree', level: 'mid'},
{levelId: 'ABC_456', value: 11, label: 'grass', level: 'top'},
{levelId: 'ABC_789', value: 11, label: 'bush', level: 'low'}
];
我想将数组二中的所有新元素放入数组一中,在本例中我希望带有
levelId: 'ABC_789
的元素移动到数组一中并将 levelId 键更改为 id:
结果:
[ {id: 'ABC_123', 值: 10, 标签: '树', 级别: 'mid'}, {id: 'ABC_456', 值: 11, 标签: '草', 级别: '顶部'} {id: 'ABC_789',值:11,标签:'灌木',级别:'低'}
]
我尝试过映射它们以匹配 id 并创建新数组,但我无法获得所需的结果
您可以从第一个数组中收集
id
值,但它们位于一个集合中,然后迭代第二个集合以选择该集合中不匹配的值。通过解构赋值,您可以实现将 levelId
更改为 id
:
// Your example input:
const a = [{id: 'ABC_123', value: 10, label: 'tree', level: 'mid'},{id: 'ABC_456', value: 11, label: 'grass', level: 'top'}];
const b = [{levelId: 'ABC_123', value: 10, label: 'tree', level: 'mid'},{levelId: 'ABC_456', value: 11, label: 'grass', level: 'top'},{levelId: 'ABC_789', value: 11, label: 'bush', level: 'low'}];
// Get the id values from the first array
const keys = new Set(a.map(({id}) => id));
// Select the items from the second array, and if their levelId is not in
// the set, add them to the first array:
for (const {levelId: id, ...rest} of b) {
if (!keys.has(id)) a.push({id, ...rest});
}
console.log(a);
您需要循环遍历这两个结构。
这是一个粗略的解决方案:
let arr1 = [
{id: 'ABC_123', value: 10, label: 'tree', level: 'mid'},
{id: 'ABC_456', value: 11, label: 'grass', level: 'top'}
];
let arr2 = [
{levelId: 'ABC_123', value: 10, label: 'tree', level: 'mid'},
{levelId: 'ABC_456', value: 11, label: 'grass', level: 'top'},
{levelId: 'ABC_789', value: 11, label: 'bush', level: 'low'}
];
function mergeArr(a1, a2) {
return a2.reduce((newArr, el) => {
const has = a1.find((entry) => entry.id === el.levelId);
if (!has) {
newArr.push({
id: el.levelId,
value: el.value,
label: el.label,
level: el.level
});
}
return newArr;
}, a1)
}
console.log(mergeArr(arr1, arr2));