Jetons un œil à un exemple.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Je dois fusionner ces 2 tableaux d'objets et créer le tableau suivant:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Existe-t-il une fonction JavaScript ou jQuery pour faire cela?
$.extend
ne me convient pas. Il retourne
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alexandre
la source
la source
{name: "lang", value: "English"}
?Réponses:
Si vous souhaitez fusionner 2 tableaux d'objets en JavaScript. Vous pouvez utiliser cette astuce en une ligne
Array.prototype.push.apply(arr1,arr2);
Par exemple
Production:
la source
arr1 = arr1.concat(arr2)
concat
renverra un nouveau tableau et cassera toutes les références que vous aviez.Avec ES6, vous pouvez le faire très facilement comme ci-dessous:
Production:
la source
{ name: 'lang', value: 'German'}
Pour ceux qui expérimentent des choses modernes:
la source
Mise à jour du 12 octobre 2019
Nouvelle version basée uniquement sur le nouveau Javascript et sans avoir besoin d'une bibliothèque tierce.
Cette réponse vieillissait, les bibliothèques comme lodash et le soulignement sont beaucoup moins nécessaires de nos jours. Dans cette nouvelle version, le tableau cible (arr1) est celui avec lequel nous travaillons et que nous souhaitons maintenir à jour. Le tableau source (arr2) est l'endroit d'où proviennent les nouvelles données, et nous voulons qu'elles soient fusionnées dans notre cible tableau .
Nous bouclons sur le tableau source à la recherche de nouvelles données, et pour chaque objet qui n'est pas encore trouvé dans notre tableau cible , nous ajoutons simplement cet objet en utilisant target.push (sourceElement) Si, en fonction de notre propriété de clé ('nom') , un object est déjà dans notre tableau cible - nous mettons à jour ses propriétés et ses valeurs en utilisant Object.assign (targetElement, sourceElement) . Notre «cible» sera toujours le même tableau et avec un contenu mis à jour.
Ancienne réponse utilisant un trait de soulignement ou un lodash
J'arrive toujours ici de google et je ne suis toujours pas satisfait des réponses. VOTRE réponse est bonne, mais ce sera plus facile et plus net en utilisant underscore.js
DÉMO: http://jsfiddle.net/guya/eAWKR/
Voici une fonction plus générale qui fusionnera 2 tableaux en utilisant une propriété de leurs objets. Dans ce cas, la propriété est 'nom'
la source
la source
Très simple en utilisant l'opérateur d'étalement ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Remarque: La solution ci-dessus consiste simplement à fusionner deux tableaux à l'aide de l'opérateur de propagation ES6.
Edit le 07 janvier 2020 par @ bh4r4th: Comme le contexte a changé en raison de modifications après ma solution initiale. Je souhaite mettre à jour ma solution pour qu'elle corresponde aux critères actuels. c'est à dire,
Fusionner les objets du tableau sans créer d’objets dupliqués et,
mettre à jour
value
si laname
propriété existe déjà dans le tableau précédentla source
set
lors de la fusion pour supprimer les doublons. Cela créerait un nouvel argument variable mais un code minimal. Cependant, je ne suis pas un grand fan de la charge utile qui a des noms définis comme des propriétés et des valeurs comme des types différents. Au lieu de cela, je préfère[ { lang: 'German', age: 25}]
. De cette façon, le poids de la charge utile sera minimisé lors de la communication entre les services.Fusion de deux tableaux:
Fusion de deux tableaux sans valeurs dupliquées pour 'nom':
la source
Le moyen le plus simple est avec un peu de magie ES6:
Fusionner deux avec des doublons:
Sans doublons, c'est la même chose que ci-dessus plus:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
la source
Avec lodash:
la source
Voici comment j'ai abordé un problème similaire dans un contexte ES6:
Remarque: cette approche ne renverra aucun élément de array1 qui n'apparaît pas dans array2.
EDIT: J'ai des scénarios dans lesquels je souhaite conserver les éléments qui n'apparaissent pas dans le deuxième tableau, j'ai donc proposé une autre méthode.
la source
Encore une autre version utilisant
reduce() method
:la source
la source
Vous pouvez utiliser un objet pour collecter vos propriétés tout en remplaçant les doublons, puis développer / aplatir cet objet en un tableau. Quelque chose comme ça:
Je ne sais pas si c'est le moyen le plus rapide, mais cela fonctionne pour n'importe quel nombre de tableaux d'entrée; par exemple, ceci:
Vous donne la même chose en ce
a
qui était enarr3
avec "allemand" remplacé par "crêpes".Cette approche suppose que vos objets ont tous la même
{name: ..., value: ...}
forme bien sûr.Vous pouvez le voir fonctionner ici (ouvrez votre console s'il vous plaît): http://jsfiddle.net/ambiguous/UtBbB/
la source
Qu'en est-il de jQuery Merge?
http://api.jquery.com/jQuery.merge/
Exemple jsFiddle ici: http://jsfiddle.net/ygByD/
la source
name
propriétés.J'étais confronté au même problème et sur la base de la réponse guya, j'ai étendu la bibliothèque de soulignements et ajouté un peu plus de fonctionnalités dont j'avais besoin. Voici l' essentiel .
J'espère que cela vous sera utile! Cordialement!
la source
J'ai récemment été perplexe avec ce problème et je suis venu ici avec l'espoir d'avoir une réponse, mais la réponse acceptée utilise 2 pour des boucles que je ne préférerais pas. J'ai finalement réussi à créer le mien. Ne dépend d'aucune bibliothèque:
Cela maintient également l'ordre de arr1.
la source
vous pouvez utiliser la fonction suivante
et essaye
la source
Ici, je filtre d'abord en
arr1
fonction de l'élément présentarr2
ou non. S'il est présent, ne l'ajoutez pas au tableau résultant, sinon ajoutez. Et puis j'ajoutearr2
au résultat.la source
Du haut de ma tête - essayez jquery extend
la source
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
la source
Array.protype.push.apply()
réponse, mais cela ne fait pas la fusion comme OP le voulait.Basé sur la réponse de @ YOU mais en gardant l'ordre:
Je sais que cette solution est moins efficace, mais elle est nécessaire si vous voulez garder l'ordre et quand même mettre à jour les objets.
la source
Voici un plugin jQuery que j'ai écrit pour fusionner deux tableaux d'objets par une clé. Gardez à l'esprit que cela modifie le tableau de destination sur place.
Version ES6
la source
Utilisation de lodash que vous voulez _.uniqBy
Ordre de arr1, arr2 compte!
Voir la documentation https://lodash.com/docs/4.17.4#uniqBy
la source
la source
la source
Si vous souhaitez fusionner les 2 tableaux, mais supprimer les objets en double, utilisez ceci. Les doublons sont identifiés sur
.uniqueId
chaque objetla source
Essaye ça:
OutPut sera:
la source
la source
Solution utilisant JS Map:
Ce qui produit:
la source
la source