La "fusion" d'objets est différente de la mise d'objets dans un tableau, qui est une agrégation. Bien qu'il vous fournisse un seul objet à transmettre, cet agrégat est structurellement différent d'un objet fusionné. L'agrégation ajoute un niveau de profondeur lors de l'accès aux valeurs dans le nouveau conteneur, qui est un tableau. Ceci est différent de la fusion qui résulte dans le même conteneur, un objet.
Si vous utilisez Dojo, que vous pouvez simplement faire:
var mergedObject = dojo.mixin(object1, object2);
Sinon, voici un moyen simple de fusionner deux ou plusieurs objets:
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}}
Comme vous le verrez, ce qui est très différent d'une agrégation:
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]}];
Ainsi, la différence est que mergedObject
ressemble {a:4, b:2, c:[1,2,3], d:{a:1}}
, où la propriété d
est accédée en tant que mergedObject.d
, par opposition à aggregation
, qui ressemble à [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}]
et où la propriété d
est accédée en tant que aggregation[1].d
.
Il convient également de noter qu'une fonction explicite pour l'agrégation n'est pas nécessaire grâce à la syntaxe de définition de tableau littéral disponible en JavaScript
var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});
est équivalent à
var aggregation = [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];
Cette question est similaire à: http://stackoverflow.com/questions/1198962/merge-two-json-objects-programmatically? –