如何将多个JavaScript对象的属性连接起来

154

我正在寻找最佳方法来“添加”多个JavaScript对象(关联数组)。

例如,给定:

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };

什么是计算的最佳方式:

{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

3
语义注释:尽管使用了 [] 语法,但它们实际上并不是数组。顺序并不能完全保证。 - Álvaro González
2
迭代顺序不受ECMA标准保证。但是在大多数浏览器中,它的实现方式是这样的。(来自John Resig)ECMAScript规范明确未定义此行为。在ECMA-262第12.6.4节中:枚举属性的机制...取决于实现。然而,规范与实现相当不同。所有现代ECMAScript实现都按照定义时的顺序迭代对象属性。因此,Chrome团队认为这是一个错误,并将对其进行修复。 - Ruan Mendes
14个回答

3
function Collect(a, b, c) {
    for (property in b)
        a[property] = b[property];

    for (property in c)
        a[property] = c[property];

    return a;
}

注意:先前对象中的现有属性将被覆盖。


2
这将产生一个副作用,即最后a === d。这可能是可以接受的,也可能不是。 - tvanfosson

1

最简单的方法:扩展运算符

var obj1 = {a: 1}
var obj2 = {b: 2}
var concat = { ...obj1, ...obj2 } // { a: 1, b: 2 }

1
也许最快、最有效、最通用的方法是这样的(您可以合并任意数量的对象,甚至将其复制到第一个对象->assign):
function object_merge(){
    for (var i=1; i<arguments.length; i++)
       for (var a in arguments[i])
         arguments[0][a] = arguments[i][a];
   return arguments[0];
}

它还允许您通过引用修改第一个对象。如果您不想这样做,而是想要包含所有属性的全新对象,则可以将{}作为第一个参数传递。
var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge(object1,object2,object3); 

combined_object和object1都包含了object1、object2、object3的属性。

var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge({},object1,object2,object3); 

在这种情况下,combined_object 包含了 object1、object2、object3 的属性,但 object1 没有被修改。
请查看这里:https://jsfiddle.net/ppwovxey/1/ 注意:JavaScript 对象是按引用传递的。

-2
function collect(a, b, c){
    var d = {};

    for(p in a){
        d[p] = a[p];
    }
    for(p in b){
        d[p] = b[p];
    }
    for(p in c){
        d[p] = c[p];
    }

    return d;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接