“合并”对象与将对象放入数组不同,后者是一种聚合。尽管它为您提供了一个可以传递的对象,但此聚合在结构上与合并对象不同。在访问新容器(一个数组)中的值时,聚合会增加一定的深度。这与合并导致相同的容器(对象)不同。
如果您使用的是 Dojo,那么您可以这样做:
var mergedObject = dojo.mixin(object1, object2);
否则,这是合并两个或多个对象的简单方法:
var merge = function() {
var result = {},
length = arguments.length,
object = null,
key = null;
if ( length < 2 ) {
throw "Must merge two or more objects";
}
for ( var i=0; i<length; ++i ) {
object = arguments[i];
for ( var key in object ) {
if ( !object.hasOwnProperty(key) ) { continue; }
result[key] = object[key];
}
}
return result;
};
var mergedObject = merge({a:1}, {b:2, c:3, d: {a: 1}}, {a: 2, c:[1,2,3]});
// mergedObject looks like {a:4, b:2, c:[1,2,3], d:{a:1}}
正如您将看到的,这与聚合非常不同:
var aggregate = function() {
if ( length < 2 ) {
throw "Must aggregate two or more objects";
}
// The following can be simplified to
// return Array.prototype.slice.call(arguments);
// but is left in a more explicit manner to illustrate the difference
var result = [],
length = arguments.length;
for ( var i=0; i<length; ++i ) {
if ( arguments.hasOwnProperty(i) ) {
result.push(arguments[i]);
}
}
return result;
};
var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});
// aggregation looks like [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];
所以区别在于mergedObject
看起来像{a:4, b:2, c:[1,2,3], d:{a:1}}
,d
访问属性的位置mergedObject.d
,而不是 aggregation
,看起来像[{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}]
和d
访问属性的位置aggregation[1].d
。
还应该注意的是,由于 JavaScript 中可用的文字数组定义语法,因此不需要显式的聚合函数
var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});
相当于
var aggregation = [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];