Verwendung von ES6+ in einer einzigen Zeile können Sie eine eindeutige Liste von Objekten nach Schlüssel erhalten:
const unique = [...new Map(arr.map((item, key) => [item[key], item])).values()]
Sie kann in eine Funktion eingefügt werden:
function getUniqueListBy(arr, key) {
return [...new Map(arr.map(item => [item[key], item])).values()]
}
Hier ein praktisches Beispiel:
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))
Wie funktioniert das?
Zunächst wird das Array so umgewandelt, dass es als Eingabe für eine Karte.
arr.map(item => [item[Schlüssel], item]);
was bedeutet, dass jedes Element des Arrays in ein anderes Array mit 2 Elementen umgewandelt wird; die gewählte Taste als erstes Element und die gesamte Ausgangsposition als zweites Element, wird dies als Eintrag bezeichnet (Bsp. Array-Einträge , Karteneinträge ). Und Hier ist das offizielle Dokument mit einem Beispiel, das zeigt, wie man Array-Einträge im Map-Konstruktor hinzufügt.
Beispiel, wenn der Schlüssel Ort :
[["here", {place: "here", name: "x", other: "other stuff1" }], ...]
Zweitens übergeben wir dieses geänderte Array an den Map-Konstruktor, und hier geschieht die Magie. Map eliminiert die doppelten Schlüsselwerte und behält nur den zuletzt eingefügten Wert desselben Schlüssels. Hinweis : Map behält die Reihenfolge des Einfügens bei. ( Unterschied zwischen Karte und Objekt prüfen )
new Map(Eintrag Array gerade oben abgebildet)
Drittens verwenden wir die Map-Werte, um die ursprünglichen Elemente abzurufen, aber diesmal ohne Duplikate.
new Map(mappedArr).values()
Und die letzte ist, diese Werte in ein neues Array hinzuzufügen, so dass es als die anfängliche Struktur aussehen kann und das zurückgeben:
return [...new Map(mappedArr).values()]