Javascript 使用ES6合并2个对象数组,并在一个不使用';不要出现在另一个

Javascript 使用ES6合并2个对象数组,并在一个不使用';不要出现在另一个,javascript,arrays,Javascript,Arrays,我有两个对象数组。一个是包含对象的“主控”,对象具有名称和数据字段。另一个数组(“更新”)用于对第一个数组进行变异,并包含相同形式的对象 我想(a)将“更新”合并到“主控”中,但前提是存在匹配的名称字段(b)显示“更新”数组中未显示在主控中的对象列表 我已经能够用普通的老JavaScript实现它,但我希望用ES6更优雅地实现它 let arr1 = [ { name: "aaaa", data: 56 }, { name: "bbbb", data: 34 }, { n

我有两个对象数组。一个是包含对象的“主控”,对象具有
名称
数据
字段。另一个数组(“更新”)用于对第一个数组进行变异,并包含相同形式的对象

我想(a)将“更新”合并到“主控”中,但前提是存在匹配的
名称
字段(b)显示“更新”数组中未显示在主控中的对象列表

我已经能够用普通的老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线解决方案,但到目前为止,我一直无法使其工作

使用a循环更新数组,使用获取
名称
数据

用于检查更新中是否存在
名称
——如果存在,则更新该条目。如果没有,则将更新推送到错误数组

const master=[
{名称:“aaaa”,数据:56},
{名称:“bbbb”,数据:34},
{名称:“cccc”,数据:25},
{名称:“dddd”,数据:78},
{名称:“eeee”,数据:12},
{名称:“ffff”,数据:12}
];
常数更新=[
{名称:“cccc”,数据:101},
{name:“err1”,数据:0},
{名称:“dddd”,数据:204},
{name:“err2”,数据:0}
];
常量错误=[];
updates.forEach(({name,data})=>{
让index=master.findIndex(x=>x.name==name);
索引!==-1?主[索引]={name,data}:错误。推送({name,data});
});
控制台日志(主);
console.log(错误)

。作为控制台包装{max height:100%!important;top:0;}
采用基于集合的方法,您可以提供函数将
名称
/
数据对转换为:

现在,您可以创建一些可用于映射的可重用函数,首先合并所有现有键:

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 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)
操作,这意味着
merge
diff
函数具有线性时间复杂度。这对于大型数据集可能很重要。

Thanky you@Light-这是非常漂亮、优雅和令人耳目一新的非深奥信息。我能够把它拆开,完全理解它。我看不到“让这个成为答案”按钮,但你的解决方案确实符合这个要求谢谢,我希望它看起来不错!但奇怪的是,答案应该是在我现在看到的旁边的upvote/downvote按钮下面的一个标记。标记为回答并再次感谢。谢谢@spender。有很多东西需要消化,但我现在正在尝试,并学到了很多。非常感谢您以可重用的方式这样布置它,我喜欢它是O(1)-现在只有小阵列,但它们可能会在以后增长。