Mam taką tablicę:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
Chciałbym to przefiltrować, aby mieć:
var bar = [ { "a" : "1" }, { "b" : "2" }];
Próbowałem użyć _.uniq, ale myślę, że ponieważ { "a" : "1" }
nie jest sobie równy, nie działa. Czy istnieje sposób na zapewnienie podkreślenia uniq z nadpisaną funkcją równa się?
javascript
json
underscore.js
plus-
źródło
źródło
{ "a" : "2" }
istnieją? Jeśli tak, to czy jest to atrybut czy wartość, która czyni go unikalnym?Odpowiedzi:
.uniq / .unique akceptuje wywołanie zwrotne
Uwagi:
Inny przykład: użycie wywołania zwrotnego do wyodrębnienia marek samochodów, kolorów z listy
źródło
false
nie jest wymagane dla_.uniq()
. Również w lodash można to napisać w ten sposób_.uniq(a, 'a');
, ponieważ zdziera on własnośća
obiektów._.uniq(a, false, 'a')
) Pingowałem na github / bestiejs / lodash i powiedzieli, że problem został naprawiony na krawędzi. Więc jeśli nie używasz funkcji, upewnij się, że masz najnowszą. Może to nie stanowić problemu dla podkreślenia.Jeśli chcesz usunąć duplikaty na podstawie identyfikatora, możesz zrobić coś takiego:
źródło
Date
. Jednak tak się dzieje.Realizacja odpowiedzi Shiplu.
źródło
JSON.parse(x[0]).a
ponieważ x nie jest tablicą obiektów, jest to tablica ciągów. Ponadto, jeśli dodasz wartości b do unikatów i odwrócisz kolejność a / b, funkcja nie będzie już uważana za unikalną. (np. „{\" a \ ": \" 1 \ ", \" b \ ": 2}"! = "{\" b \ ": 2, \" a \ ": \" 1 \ "} „) Może czegoś mi brakuje, ale czy wynik nie powinien być przynajmniej przydatny? Oto jsbin ilustrujący jsbin.com/utoruz/2/edita
dla każdego obiektu, podczas gdy mogą istnieć zduplikowane obiekty nie zawierające kluczaa
. Miałoby to jednak sens, gdybya
był to unikalny identyfikator.(a ==(=) b when a = b = {a:1})
. Punktem mojej odpowiedzi był iterator. Próbowałem odpowiedzieć, nie martwiąc się o motyw, który może być wszystkim, prawda? (np. może chcieli pobrać listę marek, kolorów z listy samochodów na wystawie. jsbin.com/evodub/2/edit ) Pozdrawiam!iterator
Kiedy mam identyfikator atrybutu, jest to mój preferowany sposób podkreślenia:
źródło
Użycie podkreślenia unikalnej biblioteki lib działa dla mnie, robię listę unikalną na podstawie _id, a następnie zwracam wartość ciągu _id:
źródło
Oto proste rozwiązanie, które wykorzystuje głębokie porównanie obiektów, aby sprawdzić, czy nie ma duplikatów (bez uciekania się do konwersji do formatu JSON, co jest nieefektywne i hakerskie)
Odfiltrowuje wszystkie elementy, jeśli mają one duplikat później w tablicy - tak, że ostatni zduplikowany element jest zachowywany.
Testowanie zduplikowanych zastosowań,
_.isEqual
które przeprowadza zoptymalizowane, głębokie porównanie między dwoma obiektami, zobacz dokumentację podkreślenia isEqual, aby uzyskać więcej informacji.edycja: zaktualizowana do użycia,
_.filter
co jest bardziej przejrzystym podejściemźródło
Dokumentacja lodash 4.6.1 podaje to jako przykład równości klucza obiektu:
_.uniqWith(objects, _.isEqual);
https://lodash.com/docs#uniqWith
źródło
Wypróbuj funkcję iteratora
Na przykład możesz zwrócić pierwszy element
źródło
_.uniq(x,function(i){ return i[0]; });
oto moje rozwiązanie (coffeescript):
przykład:
źródło
z podkreśleniem musiałem użyć String () w funkcji iteratee
źródło
Chciałem rozwiązać to proste rozwiązanie w prosty sposób, z odrobiną bólu związanego z kosztami obliczeniowymi ... ale czy nie jest to trywialne rozwiązanie z minimalną definicją zmiennej, prawda?
źródło
Przełammy to. Najpierw pogrupuj elementy tablicy według ich wartości zadanych
grouped
wygląda jak:Następnie weźmy pierwszy element z każdej grupy
bar
wygląda jak:[ { "a" : "1" }, { "b" : "2" } ]
Poskładać wszystko do kupy:
źródło
Możesz to zrobić w skrócie jako:
_.uniq(foo, 'a')
źródło