J'ai besoin de vérifier un tableau JavaScript pour voir s'il y a des valeurs en double. Quelle est la façon la plus simple de procéder? J'ai juste besoin de trouver quelles sont les valeurs dupliquées - je n'ai pas réellement besoin de leurs index ou combien de fois elles sont dupliquées.
Je sais que je peux parcourir le tableau et vérifier toutes les autres valeurs pour une correspondance, mais il semble qu'il devrait y avoir un moyen plus simple.
Question similaire:
javascript
arrays
Scott Saunders
la source
la source
Réponses:
Vous pouvez trier le tableau, puis le parcourir et voir si l'index suivant (ou précédent) est le même que l'actuel. En supposant que votre algorithme de tri est bon, il devrait être inférieur à O (n 2 ):
Dans le cas, si vous devez retourner en tant que fonction pour les doublons. C'est pour un type de cas similaire.
Référence: https://stackoverflow.com/a/57532964/8119511
la source
arr = [9, 9, 9, 111, 2, 3, 3, 3, 4, 4, 5, 7];
i++
. Au lieu de cela, ils disent de ne pas écrirej = i + +j
. Deux choses différentes à mon humble avis. Je pense quei += 1
c'est plus déroutant que le simple et le beaui++
:)var sorted_arr = arr.sort()
est inutile:arr.sort()
mute le tableau d'origine (ce qui est un problème en soi). Cela supprime également un élément. (Exécutez le code ci-dessus. Qu'arrive-t-il à 9?) Cc @dystroy Une solution plus propre seraitresults = arr.filter(function(elem, pos) { return arr.indexOf(elem) == pos; })
Si vous souhaitez éliminer les doublons, essayez cette excellente solution:
Source: http://dreaminginjavascript.wordpress.com/2008/08/22/iminating-duplicates/
la source
Voici ma réponse du fil en double (!):
Lors de l'écriture de cette entrée 2014 - tous les exemples étaient des boucles for ou jQuery. Javascript a les outils parfaits pour cela: trier, mapper et réduire.
Rechercher des éléments en double
Syntaxe plus fonctionnelle:
@ Dmytro-Laptin a souligné que certains codes étaient supprimés. Il s'agit d'une version plus compacte du même code. Utilisation de quelques astuces ES6 et de fonctions d'ordre supérieur:
la source
Rechercher des valeurs en double dans un tableau
Cela devrait être l'un des moyens les plus courts de trouver des valeurs en double dans un tableau. Comme spécifiquement demandé par le PO, cela ne supprime pas les doublons mais les trouve .
Cela n'a pas besoin de tri ni de cadre tiers. Il n'a pas non plus besoin de boucles manuelles. Il fonctionne avec toutes les valeurs prises en charge par indexOf () (ou pour être plus clair: l' opérateur de comparaison strict ).
En raison de Reduce () et indexOf (), il nécessite au moins IE 9.
la source
const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])
Vous pouvez ajouter cette fonction, ou la modifier et l'ajouter au prototype de tableau de Javascript:
la source
MISE À JOUR: Ce qui suit utilise une stratégie combinée optimisée. Il optimise les recherches de primitives pour bénéficier du temps de recherche de hachage O (1) (l'exécution
unique
sur un tableau de primitives est O (n)). Les recherches d'objets sont optimisées en étiquetant les objets avec un identifiant unique lors de l'itération, de sorte que l'identification des objets en double est également O (1) par élément et O (n) pour toute la liste. La seule exception concerne les éléments gelés, mais ceux-ci sont rares et une solution de secours est fournie à l'aide d'un tableau et d'un indexOf.Si vous avez des collections ES6 disponibles, il existe une version beaucoup plus simple et beaucoup plus rapide. (shim pour IE9 + et autres navigateurs ici: https://github.com/Benvie/ES6-Harmony-Collections-Shim )
la source
MISE À JOUR: Short one-liner pour obtenir les doublons:
Pour obtenir le tableau sans doublons, inversez simplement la condition:
Je n'y pensais tout simplement pas
filter()
dans mon ancienne réponse ci-dessous;)Lorsque tout ce dont vous avez besoin est de vérifier qu'il n'y a pas de doublons comme demandé dans cette question, vous pouvez utiliser la
every()
méthode:Notez que
every()
cela ne fonctionne pas pour IE 8 et les versions antérieures.la source
la source
'a'
dans le tableau, la fonction de filtre à l'intérieur duindex == 1
, alors queself.indexOf('a') == 0
Cela devrait vous procurer ce que vous voulez, juste les doublons.
la source
en utilisant underscore.js
la source
ES2015
Trouvez des valeurs uniques à partir de 3 tableaux (ou plus):
Juste un polyfill pour array indexOf pour les anciens navigateurs:
Solution jQuery utilisant "inArray":
au lieu d'ajouter le
Array.prototype.indexOf
la source
var r = [];
pour faire fonctionner votre code. Et a travaillé comme un charme.r
variableVoici la mienne simple et une solution en ligne.
Il recherche d'abord les éléments non uniques, puis rend le tableau trouvé unique avec l'utilisation de Set.
Nous avons donc un tableau de doublons à la fin.
la source
Voici ma proposition (ES6):
la source
undefined
est un doublon.ou lorsqu'il est ajouté à la chaîne prototyp de Array
Voir ici: https://gist.github.com/1305056
la source
i&&
c'est pour éviter de sortir des limites du tableau, mais cela signifie également que le premier élément du tableau trié ne sera pas inclus. Dans votre exemple, il n'y1
en a pas dans le tableau résultant. À savoirreturn i&&v!==o[i-1]?v:0;
devrait êtrereturn v!==o[i-1];
Manière rapide et élégante utilisant la déstructuration d'objet es6 et réduisez
Il s'exécute en O (n) (1 itération sur le tableau) et ne répète pas les valeurs qui apparaissent plus de 2 fois
la source
Voici la solution la plus simple à laquelle j'ai pu penser:
C'est ça.
Remarque:
Il fonctionne avec tous les nombres, y compris les
0
chaînes et les nombres négatifs, par exemple-1
- Question connexe: Obtenez toutes les valeurs uniques dans un tableau JavaScript (supprimez les doublons)Le tableau d'origine
arr
est conservé (filter
renvoie le nouveau tableau au lieu de modifier l'original)Le
filtered
tableau contient tous les doublons; il peut également contenir plus d'une même valeur (par exemple, notre tableau filtré est ici[ 2, 2, 0, 0, -1, 'a', 'a' ]
)Si vous souhaitez obtenir uniquement des valeurs dupliquées (vous ne voulez pas avoir plusieurs doublons avec la même valeur), vous pouvez utiliser
[...new Set(filtered)]
(ES6 a un ensemble d' objets qui ne peut stocker que des valeurs uniques)J'espère que cela t'aides.
la source
Vanille JS la plus courte :
la source
Voici un moyen très léger et simple:
la source
Avec ES6 (ou en utilisant Babel ou Typescipt), vous pouvez simplement faire:
https://es6console.com/j58euhbt/
la source
Code simple avec syntaxe ES6 (retournez un tableau trié de doublons):
Comment utiliser:
la source
bon mot
la source
indx!
le premier exemple?indx !== ...
- une inégalité stricte.result.filter((ele,indx) => indx !== result.map(e => e.name).indexOf(ele.name));
Cette réponse peut également être utile, elle exploite l'
reduce
opérateur / méthode js pour supprimer les doublons du tableau.la source
new Set([1, 2, 2, 3, 3, 3, 3])
pour supprimer les doublonsLa fonction suivante (une variation de la fonction éliminer les doublons déjà mentionnée) semble faire l'affaire, renvoyant test2,1,7,5 pour l'entrée ["test", "test2", "test2", 1, 1, 1, 2 , 3, 4, 5, 6, 7, 7, 10, 22, 43, 1, 5, 8]
Notez que le problème est plus étrange en JavaScript que dans la plupart des autres langues, car un tableau JavaScript peut contenir à peu près n'importe quoi. Notez que les solutions qui utilisent le tri peuvent avoir besoin de fournir une fonction de tri appropriée - je n'ai pas encore essayé cette route.
Cette implémentation particulière fonctionne pour (au moins) les chaînes et les nombres.
la source
ES5 uniquement (c'est-à-dire qu'il a besoin d'un polyfill filter () pour IE8 et inférieur):
la source
Cette fonction évite l'étape de tri et utilise la méthode Reduce () pour pousser les doublons vers un nouveau tableau s'il n'y existe pas déjà.
la source
C'est probablement l'un des moyens les plus rapides pour supprimer définitivement les doublons d'un tableau 10 fois plus vite que la plupart des fonctions ici. 78 fois plus rapide en safari
si vous ne pouvez pas lire le code ci-dessus demandez, lisez un livre javascript ou voici quelques explications sur le code plus court. https://stackoverflow.com/a/21353032/2450730
EDIT Comme indiqué dans les commentaires, cette fonction retourne un tableau avec des uniques, la question demande cependant de trouver les doublons. dans ce cas, une simple modification de cette fonction permet de pousser les doublons dans un tableau, puis l'utilisation de la fonction précédente
toUnique
supprime les doublons des doublons.la source
Utiliser "comprend" pour tester si l'élément existe déjà.
la source
ES6 offre la structure de données Set qui est essentiellement un tableau qui n'accepte pas les doublons. Avec la structure de données Set, il existe un moyen très simple de trouver des doublons dans un tableau (en utilisant une seule boucle).
Voici mon code
la source
Je viens de trouver un moyen simple d'y parvenir en utilisant un filtre matriciel
la source
La logique suivante sera plus facile et plus rapide
Avantages:
Description de la logique:
Remarque: les méthodes map () et filter () sont efficaces et plus rapides.
la source