148 votes

Fusion d'objets (tableaux associatifs)

Quelle est la meilleure façon de fusionner deux tableaux associatifs en JavaScript ? Est-ce que tout le monde le fait en créant son propre for boucle ?

11 votes

Il n'y a pas de tableaux associatifs en javascript, seulement des objets.

0 votes

Traverser la même question en Perl : stackoverflow.com/questions/350018/

0 votes

205voto

kulpae Points 1528

Avec jquery vous pouvez appeler $.extend

var obj1 = {a: 1, b: 2};
var obj2 = {a: 4, c: 110};

var obj3 = $.extend(obj1, obj2); 

obj1 == obj3 == {a: 4, b: 2, c: 110} // Pseudo JS

(assoc. tableaux sont des objets en js)

regardez ici : http://api.jquery.com/jQuery.extend/


éditer : Comme rymo l'a suggéré, c'est mieux de le faire de cette façon :

obj3 = $.extend({}, obj1, obj2); 
obj3 == {a: 4, b: 2, c: 110}

Comme ici, l'obj1 (et l'obj2) restent inchangés.


edit2 : En 2018, la façon de procéder est la suivante Object.assign :

var obj3 = Object.assign({}, obj1, obj2); 
obj3 === {a: 4, b: 2, c: 110} // Pseudo JS

Si vous travaillez avec ES6, cela peut être réalisé avec la fonction Opérateur d'écartement :

const obj3 = { ...obj1, ...obj2 };

54 votes

Ou pour éviter de faire des bêtises obj1 utiliser un objet vide comme cible : $.extend({}, obj1, obj2)

0 votes

Oui, lorsque vous traitez des fermetures et des objets passés par référence, suivez le conseil de rymo pour éviter d'affecter l'objet original pour les opérations ultérieures.

2 votes

Pour les navigateurs modernes, consultez la solution de @manfred en utilisant Object.assign() qui ne fait pas appel à JQuery si vous n'utilisez pas déjà cette bibliothèque.

49voto

Jonathan Fingland Points 26224

C'est ainsi que Prototype procède :

Object.extend = function(destination, source) {
    for (var property in source) {
        if (source.hasOwnProperty(property)) {
            destination[property] = source[property];
        }
    }
    return destination;
};

appelé comme, par exemple :

var arr1 = { robert: "bobby", john: "jack" };
var arr2 = { elizabeth: "liz", jennifer: "jen" };

var shortnames = Object.extend(arr1,arr2);

EDITAR : ajout d'une vérification de hasOwnProperty() comme l'a souligné bucabay dans les commentaires

6 votes

Vous aurez besoin du test source.hasOwnProperty(property) pour vous assurer que vous ne copiez que les propriétés immédiates. En l'état actuel des choses, cette méthode copiera toutes les propriétés, y compris celles dérivées de Object.prototype.

21voto

Chris Scerbo Points 41

Restez simple...

function mergeArray(array1,array2) {
  for(item in array1) {
    array2[item] = array1[item];
  }
  return array2;
}

7 votes

Vous devez vérifier hasOwnProperty pour éviter de copier des propriétés sur l'objet de l'enquête. arrau1.prototype

0 votes

@LeeGee a raison. Vous avez besoin de ça hasOwnProperty vérifier. Se référer aux objets comme des tableaux est également trompeur (ce sont des objets), les noms des arg devraient indiquer que array2 est muté ou qu'un nouvel objet doit être retourné. J'éditerais la réponse mais en fait, elle deviendrait presque exactement Réponse modifiée de Jonathan Fingland qui a déjà été corrigé.

14voto

Mike McKay Points 857

Underscore possède également une méthode extend :

Copiez toutes les propriétés des objets sources vers l'objet de destination. objet de destination. C'est dans l'ordre, donc la dernière source va remplacer les propriétés du même nom dans les arguments précédents.

_.extend(destination, *sources) 

_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}

7voto

Alex Martelli Points 330805

Sur dojo la "fusion" des deux objets/réseaux serait la suivante lang.mixin(destination, source) -- Vous pouvez également mélanger plusieurs sources en une seule destination, etc. la référence de la fonction mixin pour les détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X