J'ai deux tableaux JavaScript:
var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
Je veux que la sortie soit:
var array3 = ["Vijendra","Singh","Shakya"];
Le tableau de sortie doit avoir supprimé les mots répétés.
Comment fusionner deux tableaux en JavaScript pour ne récupérer que les éléments uniques de chaque tableau dans le même ordre qu'ils ont été insérés dans les tableaux d'origine?
javascript
arrays
merge
Vijjendra
la source
la source
Réponses:
Pour simplement fusionner les tableaux (sans supprimer les doublons)
Utilisation de la version ES5
Array.concat
:La version ES6 utilise la déstructuration
Puisqu'il n'y a pas de méthode intégrée pour supprimer les doublons ( ECMA-262 en fait,
Array.forEach
ce qui serait parfait pour cela), nous devons le faire manuellement:Ensuite, pour l'utiliser:
Cela préservera également l'ordre des tableaux (c'est-à-dire, aucun tri n'est nécessaire).
Étant donné que de nombreuses personnes sont ennuyées par l'augmentation de prototype
Array.prototype
et lesfor in
boucles, voici une façon moins invasive de l'utiliser:Pour ceux qui ont la chance de travailler avec des navigateurs où ES5 est disponible, vous pouvez utiliser
Object.defineProperty
comme ceci:la source
[a, b, c]
et[x, b, d]
soyez les tableaux (supposez les guillemets). concat donne[a, b, c, x, b, d]
. La sortie de l'unique () ne serait-elle pas[a, c, x, b, d]
. Cela ne préserve pas l'ordre, je pense - je crois que OP veut[a, b, c, x, d]
for ... in
avechasOwnProperty
auquel cas la méthode prototype est très bienAvec Underscore.js ou Lo-Dash, vous pouvez faire:
http://underscorejs.org/#union
http://lodash.com/docs#union
la source
underscore.flatten()
, c'est mieux que l'union en ce qu'il prend un tableau de tableaux.Concaténez d'abord les deux tableaux, puis filtrez uniquement les éléments uniques:
Éditer
Comme suggéré, une solution plus performante serait de filtrer les éléments uniques
b
avant de les concaténer aveca
:la source
a
pour ajouterb
, sera-t-il alors préférable de parcourir et d'utiliser push?a.forEach(function(item){ if(a.indexOf(item)<0) a.push(item); });
var c = [...a, ...b.filter(o => !~a.indexOf(o))];
2.var c = [...new Set([...a, ...b])];
☺Il s'agit d'une solution ECMAScript 6 utilisant l' opérateur générique et les génériques de tableau.
Actuellement, cela ne fonctionne qu'avec Firefox, et éventuellement avec la prévisualisation technique d'Internet Explorer.
Mais si vous utilisez Babel , vous pouvez l'avoir maintenant.
la source
Array.from
peut être utilisé à la place de l'opérateur d'épandage:Array.from(new Set([].concat(...arr)))
ES6
OU
OU
la source
union
du tout + le 1er exemple fait exploser la pile pour les grandsArray
s + le 3e exemple est incroyablement lent et consomme beaucoup de mémoire, car deux intermédiairesArray
doivent être construits + le 3e exemple ne peut être utiliséunion
qu'avec un nombre deArray
s au moment de la compilation.Set
est le chemin à parcourir iciÀ l'aide d'un ensemble (ECMAScript 2015), ce sera aussi simple que cela:
la source
const array3 = [...new Set(array1.concat(array2))]
Voici une version légèrement différente de la boucle. Avec certaines des optimisations de la dernière version de Chrome, c'est la méthode la plus rapide pour résoudre l'union des deux tableaux (Chrome 38.0.2111).
http://jsperf.com/merge-two-arrays-keeping-only-unique-values
en boucle: ~ 589 k ops / s
filtre: ~ 445 k ops / s
lodash: 308k ops / s
pour les boucles: 225k ops / s
Un commentaire a souligné qu'une de mes variables de configuration faisait que ma boucle devançait le reste, car elle n'avait pas à initialiser un tableau vide pour écrire. Je suis d'accord avec cela, j'ai donc réécrit le test pour uniformiser les règles du jeu et inclus une option encore plus rapide.
http://jsperf.com/merge-two-arrays-keeping-only-unique-values/52
Dans cette solution alternative, j'ai combiné la solution de tableau associatif d'une réponse pour éliminer l'
.indexOf()
appel dans la boucle qui ralentissait beaucoup les choses avec une deuxième boucle, et j'ai inclus certaines des autres optimisations que d'autres utilisateurs ont suggérées dans leurs réponses. .La meilleure réponse ici avec la double boucle sur chaque valeur (i-1) est encore beaucoup plus lente. lodash se porte toujours bien, et je le recommanderais toujours à tous ceux qui ne veulent pas ajouter une bibliothèque à leur projet. Pour ceux qui ne le souhaitent pas, ma boucle while est toujours une bonne réponse et la réponse du filtre a une très bonne indication ici, battant tout sur mes tests avec le dernier Canary Chrome (44.0.2360) au moment de la rédaction de cet article.
Découvrez la réponse de Mike et la réponse de Dan Stocker si vous voulez à l' étape d'un cran dans la vitesse. Ce sont de loin les résultats les plus rapides de tous les résultats après avoir examiné presque toutes les réponses viables.
la source
Vous pouvez le faire simplement avec ECMAScript 6,
la source
Array.from(new Set(array1.concat(array2)))
.tsconfig.json
, vous pouvez ajouter"downlevelIteration": true
àcompilerOptions
.Une bien meilleure fonction de fusion de tableaux.
la source
var test = ['a', 'b', 'c']; console.log(test);
imprimera["a", "b", "c", merge: function]
Je jette juste mes deux cents.
C'est une méthode que j'utilise beaucoup, elle utilise un objet comme table de hachage pour effectuer la vérification des doublons. En supposant que le hachage est O (1), cela s'exécute dans O (n) où n est a.length + b.length. Honnêtement, je n'ai aucune idée de la façon dont le navigateur effectue le hachage, mais il fonctionne bien sur plusieurs milliers de points de données.
la source
String()
fonction en javascript. Ce qui pourrait fonctionner pour les valeurs primitives (bien qu'avec des collisions entre types), mais ce n'est pas un bon choix pour les tableaux d'objets.Évitez simplement les boucles imbriquées (O (n ^ 2)) et
.indexOf()
(+ O (n)).la source
Le meilleur de cette réponse simplifié et transformé en une belle fonction:
la source
Pourquoi n'utilisez-vous pas un objet? On dirait que vous essayez de modéliser un ensemble. Cependant, cela ne préservera pas la commande.
la source
if (!set1.hasOwnProperty(key))
?La meilleure solution...
Vous pouvez vérifier directement dans la console du navigateur en appuyant sur ...
Sans doublon
Avec doublon
Si vous voulez sans doublon, vous pouvez essayer une meilleure solution à partir d'ici - Shouting Code .
Essayez sur la console du navigateur Chrome
Production:
la source
Mon centime et demi:
la source
Vous pouvez y parvenir en utilisant simplement Underscore.js => uniq :
Il imprimera ["Vijendra", "Singh", "Shakya"] .
la source
Pour ES6, une seule ligne:
la source
Je sais que cette question ne concerne pas les tableaux d'objets, mais les chercheurs se retrouvent ici.
il vaut donc la peine d'ajouter pour les futurs lecteurs une méthode de fusion ES6 appropriée, puis de supprimer les doublons
tableau d'objets :
la source
L'implémentation de la
indexOf
méthode pour les autres navigateurs provient de MDCla source
from
paramètre btw?indexOf
. Nettoyé le code en supprimant la partie commentée. @meder - merci encore.Nouvelle solution (qui utilise
Array.prototype.indexOf
etArray.prototype.concat
):Usage:
Array.prototype.indexOf (pour Internet Explorer):
la source
Cela peut être fait en utilisant Set.
la source
Il existe de nombreuses solutions pour fusionner deux tableaux. Ils peuvent être divisés en deux catégories principales (à l'exception de l'utilisation de bibliothèques tierces comme lodash ou underscore.js).
a) combinez deux tableaux et supprimez les éléments en double.
b) filtrer les éléments avant de les combiner.
Combinez deux tableaux et supprimez les éléments en double
Combiner
Unificateur
Il existe de nombreuses façons d'unifier un tableau, je suggère personnellement ci-dessous deux méthodes.
Filtrer les éléments avant de les combiner
Il existe également de nombreuses façons, mais je suggère personnellement le code ci-dessous en raison de sa simplicité.
la source
la source
La bonne chose à propos de celui-ci est la performance et que vous en général, lorsque vous travaillez avec des tableaux, vous enchaînez des méthodes comme le filtre, la carte, etc. afin que vous puissiez ajouter cette ligne et elle concaténera et dédupliquera array2 avec array1 sans avoir besoin d'une référence à la dernière. une (lorsque vous enchaînez des méthodes que vous n'avez pas), par exemple:
(Je n'aime pas polluer Array.prototype et ce serait le seul moyen de respecter la chaîne - la définition d'une nouvelle fonction la brisera - donc je pense que quelque chose comme ça est le seul moyen d'y parvenir)
la source
Vous pouvez essayer ceci:
la source
Une approche fonctionnelle avec ES2015
Suivant l'approche fonctionnelle, a
union
de deuxArray
s n'est que la composition deconcat
etfilter
. Afin de fournir des performances optimales, nous avons recours auSet
type de données natif , qui est optimisé pour les recherches de propriétés.Quoi qu'il en soit, la question clé associée à une
union
fonction est de savoir comment traiter les doublons. Les permutations suivantes sont possibles:Les deux premières permutations sont faciles à manipuler avec une seule fonction. Cependant, les deux derniers sont plus compliqués, car vous ne pouvez pas les traiter tant que vous comptez sur les
Set
recherches. Étant donné que le passage àObject
des recherches de propriétés anciennes simples entraînerait une sérieuse performance, l'implémentation suivante ignore simplement les troisième et quatrième permutations. Vous devrez créer une version distincte deunion
pour les prendre en charge.À partir de là, il devient trivial d'implémenter une
unionn
fonction, qui accepte n'importe quel nombre de tableaux (inspiré des commentaires de naomik):Il s'avère que
unionn
c'est justefoldl
(akaArray.prototype.reduce
), qui prendunion
comme réducteur. Remarque: Étant donné que l'implémentation n'utilise pas d'accumulateur supplémentaire, elle générera une erreur lorsque vous l'appliquerez sans arguments.la source
flip
et nenotf
sont pas utilisés.unionBy
Précisez également les détails d'implémentation des fuites (nécessite une connaissance implicite duSet
type). Ce serait bien si vous pouviez faire quelque chose comme ça:union = unionBy (apply)
etunionci = unionBy (p => x => p(x.toLowerCase()))
. De cette façon, l'utilisateur envoie simplement quelle que soit la valeur de regroupement àp
- juste une idée ^ _ ^zs
la déclaration de variable manque égalementvar
/let
motpour le plaisir ... voici une solution monoligne:
Pas particulièrement lisible, mais cela peut aider quelqu'un:
Set
.Set
en un tableau.sort()
fonction est appliquée au nouveau tableau.la source
reduce()
vous pouvez utiliserArray.from(set)
DeDuplicate single or Merge and DeDuplicate multiple array inputs. Exemple ci-dessous.
utilisation d'ES6 - Définir, pour, déstructurer
J'ai écrit cette fonction simple qui prend plusieurs arguments de tableau. Fait à peu près la même chose que la solution ci-dessus, il a juste un cas d'utilisation plus pratique. Cette fonction ne concatène pas les valeurs en double dans un seul tableau afin de pouvoir les supprimer ultérieurement.
DÉFINITION DE LA FONCTION COURTE (seulement 9 lignes)
UTILISER L'EXEMPLE CODEPEN :
la source
arr.map
ici? Vous l'utilisez comme unforeach
, car le résultat est ignoréla source
la source