Comment concaténer des propriétés de plusieurs objets JavaScript
Je suis à la recherche de la meilleure façon "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 }
- Une sémantique remarque: malgré le [] de la syntaxe, ils ne sont pas des tableaux à tous. L'ordre n'est pas vraiment garantie.
- Itération de l'ordre n'est pas garanti par les normes ecma. Mais c'est la façon dont il est mis en œuvre dans la plupart des navigateurs. (À partir de John Resig) Ce comportement est explicitement pas défini par la spécification ECMAScript. ECMA-262, section 12.6.4: La mécanique de l'énumération des propriétés ... est dépendant de l'implémentation. Toutefois, la spécification est tout à fait différente de la mise en œuvre. Toutes les implémentations modernes de ECMAScript itérer sur les propriétés de l'objet dans l'ordre dans lequel elles ont été définies. Pour cette raison, le Chrome, l'équipe a jugé que ce soit un bug et de le réparer.
Vous devez vous connecter pour publier un commentaire.
ECMAscript 6
Object.assign()
pour atteindre cet nativement en Javascript.MDN documentation sur l'Objet.assign()
de l'Objet.attribuer
est pris en charge de nombreux navigateurs modernes mais pas tous d'entre eux. Utiliser un transpiler comme Babel et Traceur pour générer rétro-compatible ES5 JavaScript.Object.assign.apply({}, [{a: 1}, {b: 2}, ....])
Object.assign.apply
de fusionner un tableau d'objets, est d'utiliser à la place de la propagation de l'opérateur:Object.assign( ...objects )
jQuery a une belle manière de faire.
http://api.jquery.com/jQuery.extend/
d = $.extend({},a,b,c);
Cela devrait le faire:
D'entrée:
De sortie:
length
la recherche de la taille de la matrice à chaque invocation? Je suis tellement habitué à l'écriture defor (var i = 0, len = array.length; i < len; ++i)
que je ne me souviens pas du haut de ma tête pourquoi j'ai commencé à le faire.for (var i=0; i<len; i++)
car cela donne à penser que le compteur de la boucle variablei
est une variable locale étendue de la boucle, ce qui est source de confusion, parce que JS n'a pas de notion de variables locales. Au lieu de cela,i
(et aussip
, qui est actuellement non déclaré) doivent être déclarées au début de la fonction.ECMAScript 6 a la propagation de l'opérateur. Et maintenant vous pouvez le faire:
Trait de soulignement a quelques méthodes pour ce faire;
1. _.étendre(la destination, *les sources)
Copie de toutes les propriétés dans le source objets sur le destination objet, et le retour de la destination objet.
Ou
2. _.les valeurs par défaut(objet, *les paramètres par défaut)
Remplir undefined propriétés dans objet avec des valeurs de l' par défaut objets, et le retour de la objet.
Ou
Pourquoi la fonction d'être limité à 3 arguments? Aussi, vérifiez pour
hasOwnProperty
.Avis: des propriétés Existantes dans les objets précédents seront écrasées.
a === d
à la fin. Qui peut être ok, et il ne pourrait pas.Profondes, le clonage (à l'exclusion des prototypes) ou la fusion d'objets est désormais possible à l'aide d'une syntaxe plus courte que Objet.assign().
Propagation de syntaxe pour les littéraux d'objet a été introduit dans ECMAScript 2018):
Écart (...) de l'opérateur est pris en charge dans de nombreux navigateurs modernes mais pas tous d'entre eux.
Ainsi, il est conseillé d'utiliser un transpiler comme Babel pour convertir ECMAScript 2015+ un code compatible version de JavaScript dans les actuels et les anciens navigateurs ou des environnements.
C'est l'équivalent du code Babel va générer pour vous:
Probablement, le plus rapide, plus efficace et plus générique façon de le faire (vous pouvez fusionner un nombre quelconque d'objets et même de copier au premier ->assign):
Il vous permet également de modifier le premier objet qu'il est passé par référence.
Si vous ne voulez pas cela, mais veulent avoir un tout nouvel objet contenant toutes les propriétés, vous pouvez transmettre les {} comme premier argument.
combined_object et objet1 les deux contiennent les propriétés de l'objet1,objet2,objet3.
Dans ce cas, le combined_object contient les propriétés de l'objet1,objet2,objet3 mais objet1 n'est pas modifié.
Vérifier ici: https://jsfiddle.net/ppwovxey/1/
Remarque: JavaScript les objets sont passés par référence.
Plus simple: la propagation des opérateurs
ES6 ++
La question est l'ajout des différents différents objets en un seul.
permet de dire que vous avez un objet avec plusieurs clés sont des objets:
c'était la solution que j'ai trouvé (encore foreach :/)
En faisant cela, nous pouvons ajouter dynamiquement TOUTES les clés de l'objet dans un.