我有2个对象数组。一种是“主控”,其中包含带有name
和data
字段的对象。另一个数组(“更新”)用于更改第一个数组,并包含相同形式的对象。
我想(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行解决方案,但到目前为止,我一直无法使其正常工作。
使用.forEach()
遍历更新数组,使用.forEach()
获取Destructuring和name
值
使用data
检查.findIndex()
在更新中是否存在-如果存在,请更新该条目。如果没有,请改为将更新推送到错误数组
.findIndex()
name
[采用基于集合的方法,您可以提供将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)
函数具有线性时间复杂度。这对于大型数据集可能很重要。