将两个数组合并为一个具有唯一值的数组,并更改 id 键

问题描述 投票:0回答:2

我有两个对象数组,这些数组中的对象的键略有不同,但共享相同的 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 并创建新数组,但我无法获得所需的结果

javascript arrays ecmascript-6
2个回答
0
投票

您可以从第一个数组中收集

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);


0
投票

您需要循环遍历这两个结构。

这是一个粗略的解决方案:

    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));
© www.soinside.com 2019 - 2024. All rights reserved.