我知道我应该在这种情况下使用Object.assign但是指定覆盖。我想合并常见的属性。
以下是上下文:
我有这个对象数组。
for="file-upload"
Prop1和prop3具有相同的属性值p2和p3,只有两者的p1不同。当p2和p3具有相同的值时,我想合并此数组。这是我想要的结果:
let myObjectArray = [
{ p1 : ["0000"], p2: "test", p3: "mamama" },
{ p1 : ["0100"], p2: "blabla", p3: "blablabla" },
{ p1 : ["0431"], p2: "test", p3: "mamama" }
]
我不知道如何做到这一点:使用assign()?或双循环来检查公共值,但我应该删除由于双循环出现。有更好的解决方案吗?
答案 0 :(得分:1)
您可以使用Map
作为对给定键的公共值的引用,并过滤现有对象的数组。
let array = [{ p1: ["0000"], p2: "test", p3: "mamama" }, { p1: ["0100"], p2: "blabla", p3: "blablabla" }, { p1: ["0431"], p2: "test", p3: "mamama" }];
array = array.filter((hash => o => {
let key = ['p2', 'p3'].map(k => o[k]).join('|');
if (!hash.has(key)) {
hash.set(key, o);
return true;
}
hash.get(key).p1.push(...o.p1);
})(new Map));
console.log(array);
使用新对象,而不改变给定数组。
let array = [{ p1: ["0000"], p2: "test", p3: "mamama" }, { p1: ["0100"], p2: "blabla", p3: "blablabla" }, { p1: ["0431"], p2: "test", p3: "mamama" }],
result = array.reduce((hash => (r, o) => {
let key = ['p2', 'p3'].map(k => o[k]).join('|'),
p = hash.get(key);
if (!p) {
p = Object.assign({}, o, { p1: [] });
hash.set(key, p);
r.push(p);
}
p.p1 = p.p1.concat(o.p1);
return r;
})(new Map), []);
console.log(result);
console.log(array);