Ich habe diese Art von Array:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Ich möchte es filtern, um zu haben:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Ich habe versucht, _.uniq zu verwenden, aber ich denke, weil { "a" : "1" }
es nicht gleich ist, funktioniert es nicht. Gibt es eine Möglichkeit, Unterstrich-Uniq mit einer Overriden-Equals-Funktion zu versehen?
javascript
json
underscore.js
Plus-
quelle
quelle
{ "a" : "2" }
es solche Dinge ? Wenn ja, ist es das Attribut oder der Wert, der es einzigartig macht?Antworten:
.uniq / .unique akzeptiert einen Rückruf
Anmerkungen:
Ein weiteres Beispiel: Verwenden des Rückrufs zum Extrahieren von Automarken und Farben aus einer Liste
quelle
false
ist nicht erforderlich für_.uniq()
. Auch in lodash hätte man es so schreiben können_.uniq(a, 'a');
, da es das Eigentuma
an den Objekten zupft ._.uniq(a, false, 'a')
). Ich habe github / bestiejs / lodash gepingt und sie sagten, das Problem sei am Rande behoben worden. Wenn Sie also keine Funktion verwenden, stellen Sie sicher, dass Sie über die neueste Funktion verfügen. Dies ist möglicherweise kein Problem für den Unterstrich.Wenn Sie Duplikate basierend auf einer ID entfernen möchten, können Sie Folgendes tun:
quelle
Date
. Dies ist jedoch der Fall.Umsetzung der Antwort von Shiplu.
quelle
JSON.parse(x[0]).a
x ist kein Array von Objekten, sondern ein Array von Strings. Wenn Sie den Uniques b-Werte hinzufügen und die Reihenfolge von a / b umkehren, werden sie von Ihrer Funktion nicht mehr als eindeutig betrachtet. (zB "{" a ":" 1 "," b ": 2}"! = "{" b ": 2," a ":" 1 "} ") Vielleicht fehlt mir etwas, aber sollte das Ergebnis nicht wenigstens nützlich sein? Hier ist ein jsbin, um jsbin.com/utoruz/2/edita
für jedes Objekt überprüfen , wenn es möglicherweise doppelte Objekte gibt, die den Schlüssel nicht enthaltena
. Es wäre jedoch sinnvoll, wenn es sich uma
eine eindeutige ID handeln würde.(a ==(=) b when a = b = {a:1})
. Der Punkt meiner Antwort war der Iterator. Ich versuchte zu antworten, ohne mir Gedanken über das Motiv zu machen, das alles sein könnte, oder? (zB wollten sie vielleicht eine Liste von Marken, Farben aus einer Liste von Autos in einer Show extrahieren . jsbin.com/evodub/2/edit ) Prost!iterator
Wenn ich eine Attribut-ID habe, ist dies meine bevorzugte Art im Unterstrich:
quelle
Die Verwendung der eindeutigen Unterstreichungsbibliothek funktioniert für mich. Ich mache die Liste basierend auf _id eindeutig und gebe dann den String-Wert von _id zurück:
quelle
Hier ist eine einfache Lösung, die einen tiefen Objektvergleich verwendet, um nach Duplikaten zu suchen (ohne auf die Konvertierung in JSON zurückzugreifen, was ineffizient und hackig ist).
Es filtert alle Elemente heraus, wenn sie später im Array ein Duplikat haben - so dass das letzte doppelte Element erhalten bleibt.
Das Testen auf eine doppelte Verwendung,
_.isEqual
die einen optimierten Tiefenvergleich zwischen den beiden Objekten durchführt, finden Sie in der Dokumentation zum Unterstrich isEqual für weitere Informationen.edit: aktualisiert, um
_.filter
einen saubereren Ansatz zu verwendenquelle
Die lodash 4.6.1-Dokumente haben dies als Beispiel für die Objektschlüsselgleichheit:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
quelle
Versuchen Sie die Iteratorfunktion
Zum Beispiel können Sie das erste Element zurückgeben
quelle
_.uniq(x,function(i){ return i[0]; });
Hier ist meine Lösung (Coffeescript):
Beispiel:
quelle
mit unterstrich musste ich string () in der iteratee funktion verwenden
quelle
Ich wollte diese einfache Lösung in einer einfachen Schreibweise lösen, mit ein wenig Rechenaufwand ... aber ist es nicht eine triviale Lösung mit einer minimalen Variablendefinition, oder?
quelle
Lassen Sie uns das aufschlüsseln. Zuerst können Sie die Array-Elemente nach ihrem String-Wert gruppieren
grouped
sieht aus wie:Dann holen wir uns das erste Element aus jeder Gruppe
bar
sieht aus wie:[ { "a" : "1" }, { "b" : "2" } ]
Alles zusammen:
quelle
Sie können es in Kurzform tun als:
_.uniq(foo, 'a')
quelle