合并对象属性而不覆盖

时间:2017-06-24 06:41:58

标签: javascript arrays object merge

我知道我应该在这种情况下使用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()?或双循环来检查公共值,但我应该删除由于双循环出现。有更好的解决方案吗?

1 个答案:

答案 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);