オブジェクトを「マージ」することは、オブジェクトを集合体である配列に入れることとは異なります。単一のオブジェクトを渡すことができますが、この集約はマージされたオブジェクトとは構造的に異なります。集計は、配列である新しいコンテナー内の値にアクセスする際の深さのレベルを追加します。これは、同じコンテナー (オブジェクト) になるマージとは異なります。
Dojo を使用している場合は、次のようにします。
var mergedObject = dojo.mixin(object1, object2);
それ以外の場合は、2 つ以上のオブジェクトをマージする簡単な方法を次に示します。
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]}];