Supprimer les doublons forme d'un tableau
J'ai un tableau d'objets qui ressemble à ceci:
var array = [
{id:123, value:"value1", name:"Name1"},
{id:124, value:"value2", name:"Name1"},
{id:125, value:"value3", name:"Name2"},
{id:126, value:"value4", name:"Name2"}
...
];
Comme vous pouvez le voir, certains noms sont répétés. Je veux obtenir un nouveau tableau avec les noms, mais si certains nom répète que je ne veux pas ajouter de nouveau. Je veux ce tableau:
var newArray = ["Name1", "Name2"];
Je suis en train de le faire avec map
:
var newArray = array.map((a) => {
return a.name;
});
Mais le problème est que ce retourne:
newArray = ["Name1", "Name1", "Name2", "Name2"];
Comment puis-je mettre une condition à l'intérieur de map
, de sorte qu'il ne retournera pas un élément qui existe déjà? Je veux le faire avec map
ou certains autres ECMAScript 5 ou ECMAScript 6 fonctionnalité.
- Puis supprimer les doublons à partir du tableau.
- Comment faire un
Set
? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - double possible de Supprimer les Doublons Tableau JavaScript
- Pourquoi la ligne contenant l'id:125 termine pas par une virgule?
- Veuillez noter que toutes les réponses à l'aide .indexOf() sera mauvaise performance si le tableau est grand, en raison de leur quadratique le temps de la complexité. Je vous conseille d'utiliser ES6 Set ou à l'aide d'un ES5 objet comme un dictionnaire.
Vous devez vous connecter pour publier un commentaire.
Avec ES6, vous pouvez utiliser
Set
pour des valeurs uniques, après la cartographie de seulement les noms des objets.Cette proposition utilise un la propagation de la syntaxe de
...
pour recueillir les éléments dans un tableau.JS:
...
faire?...
pour la construction d'un tableau avec un objet itérable.Set
après que vous l'avez fait? Je dirais quenames
doit être laissé comme unSet
—après tout, c' est un ensemble. Etconsole.log
, à tout le moins, n'a aucun problème avec l'impression de que un ensemble. Certaines bibliothèques ont besoin d'un tableau (n'ayant pas été mis à jour à ES6, ou de permettre à des doublons), mais en le laissant comme unSet
jusqu'à ce qu'il est nécessaire d'utiliser un tableau enregistre développeur espace libre: le moteur d'exécution est de garder la trace du fait quenames
est censé avoir des valeurs uniques, de sorte que le développeur n'a pas à s'en rappeler. Aussi, “l'intelligence” mérite bien son nom fonction d'utilité.Set
, c'est juste que vous devez également mentionner qu'il peut y avoir de meilleures approches. Et je ne pense suggérant unetoArrayFromSet
fonction d'utilité pour laset => [...set]
serait une bonne idée, parce que la syntaxe est va être difficile de savoir à d'autres développeurs (au moins pour l'instant, avec ES6 être si nouveau).toArrayFromSet
fonction - il existe déjà en tant queArray.from
Set
pour cela, vous avez oublié de vérifierArray
.Array.from
exprime l'intention de conversion beaucoup mieux (et c'est aussi plus facile à comprendre/de recherche pour les débutants), la propagation de la syntaxe devrait être utilisé que lorsque le spread élément est l'un des nombreux. Peut-être que l'appelant une "mauvaise pratique" est un peu trop dure, désolé, j'espère juste que pour l'empêcher de devenir un idiome commun.Si vous êtes à la recherche d'une solution d'activer JavaScript qui n'est pas ES 6 (pas de Jeu), vous pouvez utiliser le Du tableau
réduction
méthode:JS:
var names = array.reduce(function(a, b) { a.indexOf(b.name) === -1 && a.push(b.name) return a; }, []);
Personnellement, je ne vois pas pourquoi tout le monde est d'obtenir toutes les fantaisie avec ES 6. Si c'était mon code je préfère le support des navigateurs autant que possible.
JS:
indexOf
-ment tout le temps? E. g. neadded[name] = true
etif(added[name])
au lieu deif(a.indexOf(name))
.goto fail
, des fuites de votre index de la variable dans le cadre englobant, etc. etc. ES6 a été codifiée dans la norme pour de bonnes raisons, et pour la plupart trivial à polyfill/transformer pour les anciens navigateurs.for
boucles plus et préfère des Ensembles de Matrices a plus à faire avec exactitude. Pas de fencepost erreurs, d'exécution des garanties de déduplication, etc. etc. Ce n'est même pas y compris le potentielgoto fail
encore présents dans votre version à l'heure où j'écris cet.goto
en JavaScript, je fais référence à la célèbre Pomme SSL bug qui a été introduit à l'aide d'un conditionnel sans les accolades (suivie par quelqu'un d'autre à ajouter une autre ligne à la clause). nakedsecurity.sophos.com/2014/02/24/...Vous pouvez aussi tout simplement combiner
map
avecfilter
JS:
Vous pouvez faire Tableau.le prototype.map() pour obtenir un tableau avec les objets
name
bien et que Tableau.le prototype.filtre() à l'aide des paramètreselem
,index
etarray
, dans la fonction de prédicat, à éliminer la répétition des éléments:JS:
Beaucoup de bonnes réponses ici. Je tiens à contribuer, avec un peu de diversité avec l'espoir de vous donner un autre point de vue.
Les tableaux sont de type d'objet en JavaScript, donc il peut être utilisé comme une table de hachage en même temps. En utilisant cette fonctionnalité nous permet de simplifier considérablement la tâche à accomplir en une seule réduire opération avec O(n) le temps de la complexité.
Si vous n'êtes pas heureux avec votre groupe détient des propriétés autres que la matrice de touches, vous pourriez envisager de garder un hachage de l'objet en tant que bien.
JS:
p[c.name]
choses sur un objet distincto
et ensuite de s'en débarrasser par la suite.Je suis d'accord que si vous avez seulement besoin de l'
name
valeurs, unSet
est le chemin à parcourir.Cependant, si vous voulez obtenir un tableau d'objets uniques basées sur la
name
bien, je te suggère d'utiliser unMap
. Un moyen rapide de créer une Carte, est via un tableau de[key, value]
tableaux:JS:
CSS:
Un avantage supplémentaire de
Map
est que vous obtenez à la fois lafilter
fonctionnalité qui coupe la non-uniques, sans perdre la connexion avec la source des objets. Bien sûr, il est uniquement nécessaire si vous avez besoin de faire référence à l'ensemble unique d'objets plusieurs fois.Si vous êtes limité à ES5, je voudrais utiliser Lodash de
_.uniq
Avec ES6 cela devrait faire le travail.
JS:
map
est censé être utilisé avec les fonctions pures, de ne pas avoir des effets secondaires. Ce serait un travail pourforEach
oureduce
.À L'Aide De UnderscoreJS,
JS:
HTML:
`
Dans l'ES5, utiliser un objet comme un dictionnaire pour O(n) de la performance.
Cela ne fonctionne que si toutes les clés sont des Chaînes de caractères.
Vous pourriez faire la même chose dans une expression si vous le souhaitez:
mais je trouve l'impératif à la forme plus facile à lire.
function (item) { return item.name; }
Object.keys()
, cette réponse utilisefilter()
pour ne garder que les noms qui n'ont pas encore été enregistrées dans la carte, ce qui est assez élégant.Essayez ceci:
Utilisation
array#forEach()
etarray#indexOf()
méthodes de ce genre si vous voulez un maximum de compatibilité encore, concis syntaxe:JS:
Toutefois, si la compatibilité est pas un problème utilisation ECMAScript 6's
Set
objet,array#map
etArray.à partir de()
méthodes comme ceci:JS:
C'est la façon dont je l'ai fait, en utilisant un tableau vide.
JS:
Pour ceux qui cherchent un 1 liner
ou sans l'aide de méthodes sur le tableau du prototype
pourrait être utile pour l'écriture de certaines fonctions pures pour faire face à cette