Quelle est la meilleure façon / standard de fusionner deux tableaux associatifs en JavaScript? Tout le monde le fait-il simplement en roulant sa propre for
boucle?
javascript
object
Wilhelm
la source
la source
Réponses:
avec jquery vous pouvez appeler
$.extend
(les tableaux associés sont des objets dans js)
regardez ici: http://api.jquery.com/jQuery.extend/
edit: Comme Rymo l'a suggéré, il vaut mieux le faire de cette façon:
Comme ici obj1 (et obj2) restent inchangés.
edit2: En 2018, la façon de le faire est via
Object.assign
:Si vous travaillez avec ES6, cela peut être réalisé avec l' opérateur Spread :
la source
obj1
, utilisez un objet vide comme cible:$.extend({}, obj1, obj2)
Object.assign()
, qui ne repose pas sur JQuery si vous n'utilisez pas déjà la bibliothèque.Maintenant, en 2016, je dirais que le meilleur moyen / standard est Object.assign ()
Pure Javascript. Aucun jQuery n'est nécessaire.
Plus d'informations, d'exemples et de polyfill ici:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
la source
Voici comment Prototype procède:
appelé comme, par exemple:
EDIT : ajout de hasOwnProperty () check comme correctement indiqué par bucabay dans les commentaires
la source
Rester simple...
la source
arrau1.prototype
hasOwnProperty
chèque. Faire référence aux objets en tant que tableaux est également trompeur (ce sont des objets), les noms d'arguments doivent indiquer que array2 est muté ou qu'un nouvel objet doit être retourné. Je modifierais la réponse, mais en fait, elle deviendrait presque exactement la réponse modifiée de Jonathan Fingland qui a déjà été corrigée.Underscore a également une méthode d'extension:
la source
Dans dojo , la "fusion" à 2 objets / tableaux serait
lang.mixin(destination, source)
- vous pouvez également mélanger plusieurs sources dans une seule destination, etc. - voir la référence de la fonction mixin pour plus de détails.la source
voulez-vous écraser une propriété si les noms sont identiques mais que les valeurs ne le sont pas?
Et voulez-vous changer définitivement l'un des objets d'origine,
ou voulez-vous qu'un nouvel objet fusionné soit renvoyé?
la source
Rouler votre Prolongez / mixin Fonction
...
...
Cela étend simplement un splat d'objets, de manière récursive. Notez également que cette fonction récursive est TCO ( Tail-Call Optimized ) car son retour est le dernier appel à lui-même.
En outre, vous souhaiterez peut-être des propriétés ciblées . Dans ce cas, vous souhaiterez peut-être condenser les objets en fonction de
id
,quantity
ou une autre propriété. Cette approche pourrait avoir un petit livre écrit à ce sujet et nécessite une juxtaposition d'objets et peut devenir très complexe. J'ai écrit une petite bibliothèque pour cela qui est disponible sur demande.J'espère que cela t'aides!
la source
la source
En 2019, vous avez 2 bonnes options:
Attribution d'objets [ doc ]
Répartition d'objets [ doc ]
Le premier a tendance à être plus sûr, plus standard et polyvalent. Un bon pour et contre ici
la source
Yahoo UI (YUI) a également une fonction d'assistance pour cela:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
la source
jquery a un booléen pour la copie profonde. Vous pourriez faire quelque chose comme ça:
Vous pouvez également modifier cette fonction pour prendre en charge les n-tableaux à fusionner.
Alors maintenant tu peux faire
la source
J'avais besoin d'une fusion d'objets en profondeur. Donc, toutes les autres réponses ne m'ont pas beaucoup aidé. _.extend et jQuery.extend fonctionnent bien, à moins que vous n'ayez un tableau récursif comme moi. Mais ce n'est pas si grave, vous pouvez le programmer en cinq minutes:
la source
Pour fusionner des tableaux dans jQuery, qu'en est-il de $ .merge?
la source
Solution récursive (étend également les tableaux d'objets) + null vérifié
Des tests
la source
Object.getOwnPropertyNames is not a function
je planterai l'application.Voici la meilleure solution.
En outre,
obj1
peut se développer à l'intérieur d'une boucle sans aucun problème. (disons queobj2
c'est dynamique)la source