【问题标题】:Merging two Javascript objects into key, array pairs [duplicate]将两个 Javascript 对象合并为键、数组对 [重复]
【发布时间】:2018-05-16 12:25:41
【问题描述】:

如果我有两个对象:

const obj1 = {
 "1,1" : "hello",
}

 const obj2 = {
 "1,1" : "hi",
}

将它们合并到的最简单方法是什么:

obj3 = {
"1,1": ["hello", "hi"],
} 

我可以在这里使用扩展运算符吗?谢谢!

【问题讨论】:

标签: javascript arrays javascript-objects


【解决方案1】:

另一种方法是使用函数reduce

const obj1 = {"1,1" : "hello"},
      obj2 = {"1,1" : "hi"},
      obj3 = [obj1, obj2].reduce((a, c) => {
                Object.keys(c).forEach(k => (a[k] || (a[k] = [])).push(c[k]));
                return a;
             }, {});

console.log(obj3);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 我不认为reduce 应该改变任何参数,所以forEach 似乎更适合这里。不过,我不是反对者;)
  • 您正在从reduce 中改变对象a,而不是返回一个新对象——这就是@sp00m 所指的。很抱歉,您觉得人们不欣赏您的工作 - 但在那些花费大量时间确保我们也拥有经过深思熟虑的规范知识库的人身上,有一些非常重要的东西 - 无需讨厌他们。
  • @BenjaminGruenbaum 如果您认为这就是 spOOm 所指的,那么forEach 会有什么不同?它会通过反复改变一个对象来逐渐积累所有的属性。
  • 让我们停止谈话。当然,我们所有人都想提供帮助,所以很感激。希望这些 cmets 和我的回答在某种程度上有助于 OP 的要求。
  • 哇,升级很快,哈哈!我的意思是,在返回它之前,你在这里改变了a(正如@BenjaminGruenbaum 解释的那样),这在我看来至少在功能世界中不是reduce 的语义。基本上,您的回调不是,仅此而已。但无论如何,这个解决方案对我来说仍然很好,不值得所有这些反对,我只是想分享这一点:)
【解决方案2】:

var obj1 = {
    a: 1,
    b: 2
};

var obj2 = {
    a: 12,
    c: 20
};

console.log(merge(obj1, obj2));

function merge(obj1, obj2) {

    var obj3 = {};

    Object.keys(obj1).forEach(function(key) {
        pushIntoObj3(key, obj1[key]);
    });

    Object.keys(obj2).forEach(function(key) {
        pushIntoObj3(key, obj2[key]);
    });

    function pushIntoObj3(key, val) {
        if (!obj3[key]) {
            obj3[key] = [];
        }
        obj3[key].push(val);
    }

    return obj3;
}

输出:

{
  "a": [ 1, 12 ],
  "b": [ 2 ],
  "c": [ 20 ]
}

【讨论】:

    【解决方案3】:

    一种简单的方法是使用 javascript 的内部 for (.. in ...) : 例如

    obj1 = {1 : 2};
    obj2 = {1 : 3};
    obj3 = {};
    
    for (element1 in obj1) {
     for (element2 in obj2) { 
       if (element1 == element2) {
            obj3[element1] = [];
            obj3[element1].push(obj1[element1]);
            obj3[element1].push(obj2[element2]);
        }
       }
      }
    //result : obj3 = {1 : [2,3]}
    

    但是如果 obj1 = {"1,1" : 2, 1.1 : 3} 或 obj1 = {"1,1" : [1,2,3,4]} 呢?您确实需要“很好地定义”您的需求,但这应该是一个很好的开始。

    【讨论】:

    • {a: 1, a: 2} 作为边缘案例毫无意义。您不能为对象文字中的同一个键分配不同的值,最后一个值获胜。您的假设问题案例{"1,1" : 2, "1,1" : 3}{"1,1" : 3} 相同。
    • 是的,好点@meager。现在尝试使用 1.1 vs "1.11" 或类似的东西。我试图证明 [1,2,3] 与 [1,[2,3]] 不同。这个问题需要细化...
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2020-05-16
    • 2018-05-24
    相关资源
    最近更新 更多