【问题标题】:Merge object properties without overwritting合并对象属性而不覆盖
【发布时间】:2017-11-27 18:04:09
【问题描述】:

我知道我应该在这种情况下使用 Object.assign 但分配覆盖。我想合并公共属性。

这里是上下文:

我有这个对象数组。

let myObjectArray = [
    { p1 : ["0000"], p2: "test", p3: "mamama" },
    { p1 : ["0100"], p2: "blabla", p3: "blablabla" },
    { p1 : ["0431"], p2: "test", p3: "mamama" }
]

Prop1 和 prop3 的属性 p2 和 p3 的值相同,只是两者的 p1 不同。当 p2 和 p3 具有相同的值时,我想合并这个数组。这是我想要的结果:

let resultArray = [
        { p1 : ["0000", "0431"], p2: "test", p3: "mamama" },
        { p1 : ["0100"], p2: "blabla", p3: "blablabla" },
    ]

我不知道该怎么做:使用assign()?或双循环来检查公共值,但由于双循环,我应该删除这种情况。有没有更好的解决方案?

【问题讨论】:

  • 查看 Array reduce - 可能会使代码更易于管理
  • 你可能想检查你的“对象数组”——它不是有效的语法——你的预期结果数组也不是
  • 最后 - 了解数字 0431 是十进制 2810100 是十进制 64
  • 请定义common,为什么prop3 有两个属性与p3合并之后prop3会发生什么?
  • 哎呀,对不起,那是早上。纠正那个。数字用于测试,想象一下不同的字符串或数字。这只是一个例子。我想知道如何做到这一点以适应我的项目

标签: javascript arrays object merge


【解决方案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);

【讨论】:

  • 哇,非常感谢。希望它不会花费你太多时间。我稍后会检查它。无论如何,非常感谢您的宝贵时间
  • 我只有一个问题要问你。我不太了解这部分代码的符号:hash => (r, o) =>。我知道 ES6 中的简单箭头函数,但不知道“=>”两次。如果你能帮助我。
  • 就像function (hash) { return function (r, o) {}; }(new Map)。它是哈希的闭包。