Comment puis-je obtenir une liste de valeurs uniques dans un tableau? Dois-je toujours utiliser un deuxième tableau ou y a-t-il quelque chose de similaire au hashmap de java en JavaScript?
Je vais utiliser uniquement JavaScript et jQuery . Aucune bibliothèque supplémentaire ne peut être utilisée.
javascript
jquery
Astronaute
la source
la source
underscore.js
bibliothèque?list.toSet
Réponses:
Depuis que j'en ai parlé dans les commentaires de la réponse de @ Rocket, je peux aussi bien fournir un exemple qui n'utilise aucune bibliothèque. Cela nécessite deux nouvelles fonctions de prototype,
contains
etunique
Pour plus de fiabilité, vous pouvez remplacer
contains
par leindexOf
shim de MDN et vérifier si chaque élémentindexOf
est égal à -1: documentationla source
~a.indexOf(b) === (a.indexOf(b) == -1)
if (~a.indexOf(b)) ...
est identique à l'écriture plus longueif (a.indexOf(b) == -1) ...
.Ou pour ceux qui recherchent un one-liner (simple et fonctionnel), compatible avec les navigateurs actuels :
Mise à jour 18-04-2017
Il semble que 'Array.prototype.includes' soit désormais largement pris en charge dans les dernières versions des navigateurs principaux ( compatibilité )
Mise à jour 29-07-2015:
Il y a des plans en cours pour que les navigateurs prennent en charge une méthode standardisée «Array.prototype.includes», qui bien qu'elle ne répond pas directement à cette question; est souvent liée.
Usage:
Pollyfill ( support du navigateur , source de mozilla ):
la source
Voici une solution beaucoup plus propre pour ES6 que je vois n'est pas incluse ici. Il utilise le Set et l' opérateur de diffusion :
...
Quels retours
[1, 2]
la source
Array.from(... new Set(a))
car Set ne peut pas être implicitement converti en type tableau. Juste un avertissement!Array.from(new Set(a))
? Cela semble fonctionner.Une doublure, pur JavaScript
Avec la syntaxe ES6
list = list.filter((x, i, a) => a.indexOf(x) === i)
Avec la syntaxe ES5
Compatibilité du navigateur : IE9 +
la source
a.indexOf(x) === i
note d' égalité des trois signes d'égalité.En utilisant EcmaScript 2016, vous pouvez simplement le faire comme ceci.
Les ensembles sont toujours uniques et à l'aide de,
Array.from()
vous pouvez convertir un ensemble en tableau. Pour référence, jetez un œil aux documentations.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Ensemble
la source
indexOf()
les réponses sont terribles parce qu'elles sont O (N ^ 2). Les réponses étalées sont correctes mais ne fonctionneront pas pour les grands tableaux. C'est la meilleure approche.Maintenant dans ES6, nous pouvons utiliser la fonction ES6 nouvellement introduite
OU par Array répartit la syntaxe sur les itérables
Il renverra le résultat unique.
la source
new Set
comme celui-ci (tel que Angular / TypeScript moderne)let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2];
let uniqueItems = [...new Set(items)];
Si vous souhaitez conserver la matrice d'origine intacte,
vous avez besoin d'un second tableau pour contenir les éléments uniqe du premier
La plupart des navigateurs ont
Array.prototype.filter
:la source
De nos jours, vous pouvez utiliser le type de données Set d'ES6 pour convertir votre baie en un ensemble unique. Ensuite, si vous devez utiliser des méthodes de tableau, vous pouvez le reconvertir en un tableau:
la source
var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Pas natif en Javascript, mais de nombreuses bibliothèques ont cette méthode.
Underscore.js
_.uniq(array)
( lien ) fonctionne assez bien ( source ).la source
En utilisant jQuery, voici une fonction unique de Array que j'ai créée:
la source
$.uniqueArray(arr)
? L'intégration de références à jQuery dansArray
le prototype de 's semble discutable$.uniqueArray
dépend de jQuery; moins évident qui l'Array.prototype.unique
est aussi.prototype
s. Mais, je comprends votre point maintenant. Je vais laisser ça ici de toute façon.Solution courte et douce utilisant un deuxième tableau;
la source
Rapide, compact, sans boucles imbriquées, fonctionne avec n'importe quel objet, pas seulement des chaînes et des nombres, prend un prédicat et seulement 5 lignes de code !!
Exemple: pour rechercher des éléments uniques par type:
Si vous voulez qu'il trouve le premier élément unique au lieu du dernier, ajoutez un enregistrement found.hasOwnPropery ().
la source
Vous n'avez besoin que de vanilla JS pour trouver des uniques avec Array.some et Array.reduce. Avec la syntaxe ES2015, il n'y a que 62 caractères.
Array.some et Array.reduce sont pris en charge dans IE9 + et d'autres navigateurs. Modifiez simplement les fonctions de la grosse flèche pour que les fonctions normales prennent en charge dans les navigateurs qui ne prennent pas en charge la syntaxe ES2015.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Array / Réduire
la source
La majorité des solutions ci-dessus ont une complexité d'exécution élevée.
Voici la solution qui utilise
reduce
et peut faire le travail en un temps O (n).Remarque:
Cette solution ne dépend pas de réduire. L'idée est de créer une carte d'objets et d'en pousser des uniques dans le tableau.
la source
Manière ES6:
la source
vous pouvez utiliser,
cela vous donnera des éléments uniques,
**> mais il y a un hic,
la deuxième option consiste à utiliser la méthode de filtrage sur le tableau.
la source
Vous pouvez entrer un tableau avec des doublons et la méthode ci-dessous retournera un tableau avec des éléments uniques.
la source
Le seul problème avec les solutions proposées jusqu'à présent est l'efficacité. Si cela vous préoccupe (et vous devriez probablement), vous devez éviter les boucles imbriquées: pour * for, filter * indexOf, grep * inArray, elles itèrent toutes le tableau plusieurs fois. Vous pouvez implémenter une seule boucle avec des solutions comme celle-ci ou celle-ci
la source
la source
J'ai essayé ce problème en pur JS. J'ai suivi les étapes suivantes 1. Trier le tableau donné, 2. parcourir le tableau trié, 3. Vérifier la valeur précédente et la valeur suivante avec la valeur actuelle
Démo
la source
la source
Ayant à l'esprit que
indexOf
retournera la première occurrence d'un élément, vous pouvez faire quelque chose comme ceci:la source
Si vous n'avez pas à vous soucier autant des anciens navigateurs, c'est exactement ce pour quoi les ensembles sont conçus.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
la source
Une autre pensée de cette question. Voici ce que j'ai fait pour y parvenir avec moins de code.
la source
la source
Voici une approche avec une
equals
fonction personnalisable qui peut être utilisée pour les primitives ainsi que pour les objets personnalisés:usage:
la source
Ma réponse utilise
Array.filter
etArray.indexOf
méthodes pour obtenir les valeurs uniquesJ'ai vu cette approche sur un site Web, mais leur code est différent de ce qu'il en a ici. J'ai simplifié le code en une seule ligne et je l'ai affiché ici pour que quelqu'un en profite
Remarque: mon approche est similaire ou identique à celle publiée par Josh. Je le laisse ici car les noms des variables sont explicites dans mon code.
la source
Je pensais juste si nous pouvions utiliser la recherche linéaire pour éliminer les doublons:
}
HTML:
la source
Voici la solution unique au problème:
Copiez-collez ceci dans la console du navigateur et obtenez les résultats, yo :-)
la source
J'ai une fonction JQuery Unique intégrée.
Pour plus d'informations, vous pouvez vous référer aux documentations de l'API jquery.
http://api.jquery.com/jquery.unique/
la source