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)-现在只有小阵列,但它们可能会在以后增长。