Utilisation de ES6 en une seule ligne, vous pouvez obtenir une liste unique d'objets par clé :
const unique = [...new Map(arr.map((item, key) => [item[key], item])).values()]
Il peut être mis dans une fonction :
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
Voici un exemple concret :
const arr = [
{place: "here", name: "x", other: "other stuff1" },
{place: "there", name: "x", other: "other stuff2" },
{place: "here", name: "y", other: "other stuff4" },
{place: "here", name: "z", other: "other stuff5" }
]
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
const arr1 = getUniqueListBy(arr, 'place')
console.log("Unique by place")
console.log(JSON.stringify(arr1))
console.log("\nUnique by name")
const arr2 = getUniqueListBy(arr, 'name')
console.log(JSON.stringify(arr2))
Comment cela fonctionne-t-il ?
Tout d'abord, le tableau est remodelé de manière à pouvoir être utilisé comme entrée pour une fonction Carte.
arr.map(item => [item[key], item]) ;
ce qui signifie que chaque élément du tableau sera transformé en un autre tableau de 2 éléments ; l'option touche sélectionnée comme premier élément et l'ensemble de l'élément initial comme deuxième élément, cela s'appelle une entrée (ex. entrées du tableau , entrées de cartes ). Et voici le doc officiel avec un exemple montrant comment ajouter des entrées de tableau dans le constructeur de la carte.
Exemple lorsque la touche est place :
[["here", {place: "here", name: "x", other: "other stuff1" }], ...]
Ensuite, nous passons ce tableau modifié au constructeur de Map et voilà la magie qui opère. Map va éliminer les valeurs des clés en double, en ne gardant que la dernière valeur insérée de la même clé. Note : La carte conserve l'ordre d'insertion. ( vérifier la différence entre carte et objet )
nouvelle Map(tableau d'entrée juste mappé ci-dessus)
Troisièmement, nous utilisons les valeurs de la carte pour retrouver les éléments originaux, mais cette fois sans les doublons.
nouvelle Map(mappedArr).values()
Et le dernier est d'ajouter ces valeurs dans un nouveau tableau pour qu'il puisse ressembler à la structure initiale et le retourner :
return [...new Map(mappedArr).values()]
0 votes
Voulez-vous dire comment empêcher qu'une table de hachage/un objet avec tous les mêmes paramètres soit ajouté à un tableau ?
9 votes
Mathew -> S'il est plus simple d'empêcher un objet en double d'être ajouté au tableau en premier lieu, au lieu de le filtrer plus tard, oui, ce serait bien aussi.
18 votes
Je suis toujours surpris de voir comment les gens nomment leurs variables. Parfois, je pense qu'ils veulent vraiment rendre les choses inutilement compliquées. La prochaine étape sera
aaaaa.aaaa.push(...)
:)2 votes
Downmodded pour
things.thing
. Cela complique inutilement la question et la réponse.0 votes
Des réponses super longues et pourtant MDN a probablement les réponses les plus courtes :
arrayWithNoDuplicates = Array.from(new Set(myArray))
7 votes
@tonkatata Cela ne fonctionne pas avec les tableaux d'objets.