使用ES6合并2个对象数组,并在一个数组中显示对象,而在另一个数组中不显示对象

问题描述 投票:-1回答:2

我有2个对象数组。一种是“主控”,其中包含带有namedata字段的对象。另一个数组(“更新”)用于更改第一个数组,并包含相同形式的对象。

我想(a)将“ updates”合并到“ master”中,但仅当有匹配的name字段时(b)显示“ updates”数组中未出现在master中的对象列表。

我已经能够使用普通的旧JavaScript来实现,但是我想使用ES6来更加优雅地实现它。

let arr1 = [
    { name: "aaaa", data: 56 },
    { name: "bbbb", data: 34 },
    { name: "cccc", data: 25 },
    { name: "dddd", data: 78 },
    { name: "eeee", data: 12 },
    { name: "ffff", data: 12 }
];

let arr1 = [
    { name: "cccc", data: 101 },
    { name: "err1", data: 0 },
    { name: "dddd", data: 204 },
    { name: "err2", data: 0 }
]; 

// some clever ES6 code that generates result[] and errors[] arrays

result = [
    { name: "aaaa", data: 56 },
    { name: "bbbb", data: 34 },
    { name: "cccc", data: 101 },
    { name: "dddd", data: 204 },
    { name: "eeee", data: 12 },
    { name: "ffff", data: 12 }
]

errors = [
    { name: "err1", data: 0 },
    { name: "err2", data: 0 }
]

我希望有一个非常优雅的2或3行解决方案,但到目前为止,我一直无法使其正常工作。

javascript arrays
2个回答
0
投票

使用.forEach()遍历更新数组,使用.forEach()获取Destructuringname

使用data检查.findIndex()在更新中是否存在-如果存在,请更新该条目。如果没有,请改为将更新推送到错误数组

.findIndex()
name

0
投票

[采用基于集合的方法,您可以提供将const master = [ { name: "aaaa", data: 56 }, { name: "bbbb", data: 34 }, { name: "cccc", data: 25 }, { name: "dddd", data: 78 }, { name: "eeee", data: 12 }, { name: "ffff", data: 12 } ]; const updates = [ { name: "cccc", data: 101 }, { name: "err1", data: 0 }, { name: "dddd", data: 204 }, { name: "err2", data: 0 } ]; const errors = []; updates.forEach(({name, data}) => { let index = master.findIndex(x => x.name === name); index !== -1 ? master[index] = {name, data} : errors.push({name, data}); }); console.log(master); console.log(errors); / .as-console-wrapper { max-height: 100% !important; top: 0; }对转换成name的功能:

data

现在您可以创建一些可在地图上使用的可重用函数,首先合并所有现有键:

Map

...然后拆分出不存在的键:

const toMapEntries = arr => arr.map(({ name, data }) => [name, data]);
const toMap = arr => new Map(toMapEntries(arr));
const fromMap = map => [...map].map(([k, v]) => ({ name: k, data: v }));

如下使用它们:

const merge = (map1, map2) =>
  new Map([...map1, ...[...map2].filter(([k]) => map1.has(k))]);

使用基于地图的方法的优势在于,在地图上进行键查找是const diff = (map1, map2) => new Map([...map1].filter(([k]) => !map2.has(k))); 操作,这意味着const map1 = toMap(arr1); const map2 = toMap(arr2); const mergedResults = fromMap(merge(map1, map2)); const errorResults = fromMap(diff(map2, map1)); O(1)函数具有线性时间复杂度。这对于大型数据集可能很重要。

© www.soinside.com 2019 - 2024. All rights reserved.