Объекты «Объединение» отличаются от размещения объектов в массиве, который является агрегацией. Хотя он предоставляет вам один объект для передачи, этот агрегат структурно отличается от объединенного объекта. Агрегация добавляет уровень глубины при доступе к значениям в новом контейнере, который представляет собой массив. Это отличается от слияния, которое приводит к тому же контейнеру, к объекту.
Если вы используете 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]}];
Этот вопрос похож на: http://stackoverflow.com/questions/1198962/merge-two-json-objects-programmatically? –