Je cherche le meilleur moyen "d'ajouter" plusieurs objets JavaScript (tableaux associatifs).
Par exemple, étant donné:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
quelle est la meilleure façon de calculer:
{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
ECMAscript 6 a introduit Object.assign()
pour y parvenir de manière native en Javascript.
La méthode Object.assign () permet de copier les valeurs de toutes les propriétés propres énumérables d'un ou de plusieurs objets source vers un objet cible. Il retournera l'objet cible.
Documentation MDN sur Object.assign ()
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
Object.assign
est pris en charge par de nombreux navigateurs modernes mais pas encore tous. Utilisez un transpiler tel que Babel et Traceur pour générer du code JavaScript ES5 rétrocompatible.
jQuery a une bonne façon de faire cela.
Cela devrait le faire:
function collect() {
var ret = {};
var len = arguments.length;
for (var i=0; i<len; i++) {
for (p in arguments[i]) {
if (arguments[i].hasOwnProperty(p)) {
ret[p] = arguments[i][p];
}
}
}
return ret;
}
Contribution:
a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
d = collect(a, b, c);
console.log(d);
Sortie:
Object one=1 two=2 three=3 four=4 five=5
ECMAScript 6 a propagation opérateur . Et maintenant tu peux faire ça:
const obj1 = {1: 11, 2: 22}
const obj2 = {3: 33, 4: 44}
const obj3 = {...obj1, ...obj2}
console.log(obj3)
// {1: 11, 2: 22, 3: 33, 4: 44}
Underscore a peu de méthodes pour le faire;
1. _.extend (destination, * sources)
Copiez toutes les propriétés des objets source sur l'objet destination, puis renvoyez-les destination.
_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Ou
_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
2. _.defaults (objet, * par défaut)
Renseignez les propriétés non définies dans objet avec les valeurs des objets paramètres par défaut et renvoyez-les objet.
_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Ou
_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
Pourquoi la fonction devrait-elle être limitée à 3 arguments? Aussi, vérifiez pour hasOwnProperty
.
function Collect() {
var o={};
for(var i=0;i<arguments.length;i++) {
var arg=arguments[i];
if(typeof arg != "object") continue;
for(var p in arg) {
if(arg.hasOwnProperty(p)) o[p] = arg[p];
}
}
return o;
}
function Collect(a, b, c) {
for (property in b)
a[property] = b[property];
for (property in c)
a[property] = c[property];
return a;
}
Remarque: les propriétés existantes dans les objets précédents seront écrasées.
Le clonage superficiel (à l’exception du prototype) ou la fusion d’objets est désormais possible avec une syntaxe plus courte que Object.assign () .
La syntaxe de propagation pour les littéraux d'objet a été introduite dans ECMAScript 2018 ):
const a = { "one": 1, "two": 2 };
const b = { "three": 3 };
const c = { "four": 4, "five": 5 };
const result = {...a, ...b, ...c};
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
L'opérateur Spread (...) est pris en charge dans de nombreux navigateurs modernes mais pas tous.
Il est donc recommandé d’utiliser un transpiler like Babel pour convertir le code ECMAScript 2015+ en une version rétro-compatible de JavaScript dans les navigateurs ou les environnements actuels et anciens.
C'est le code équivalent Babel va générer pour vous:
"use strict";
var _extends = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var a = { "one": 1, "two": 2 };
var b = { "three": 3 };
var c = { "four": 4, "five": 5 };
var result = _extends({}, a, b, c);
// Object { "one": 1, "two": 2 , "three": 3, "four": 4, "five": 5 }
Le plus simple: les opérateurs de spread
var obj1 = {a: 1}
var obj2 = {b: 2}
var concat = { ...obj1, ...obj2 } // { a: 1, b: 2 }
La manière la plus rapide, efficace et générique est probablement la suivante (vous pouvez fusionner un nombre illimité d’objets et même les copier dans le premier -> assigner):
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];
}
Il vous permet également de modifier le premier objet lorsqu’il est passé par référence. Si vous ne voulez pas cela, mais voulez avoir un tout nouvel objet contenant toutes les propriétés, vous pouvez passer {} comme premier argument.
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);
combine_object et object1 contiennent tous deux les propriétés de 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);
Dans ce cas, combine_object contient les propriétés de object1, object2, object3 mais object1 n'est pas modifié.
Vérifiez ici: https://jsfiddle.net/ppwovxey/1/
Remarque: les objets JavaScript sont passés par référence.
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;
}
ES6 ++
La question est d'ajouter divers différents objets en un.
let obj = {};
const obj1 = { foo: 'bar' };
const obj2 = { bar: 'foo' };
Object.assign(obj, obj1, obj2);
//output => {foo: 'bar', bar: 'foo'};
disons que vous avez un objet avec plusieurs clés qui sont des objets:
let obj = {
foo: { bar: 'foo' },
bar: { foo: 'bar' }
}
c’est la solution que j’ai trouvée (il me reste encore à chercher: /)
let objAll = {};
Object.values(obj).forEach(o => {
objAll = {...objAll, ...o};
});
En faisant cela, nous pouvons ajouter dynamiquement TOUTES les clés d'objet en une.
// Output => { bar: 'foo', foo: 'bar' }