Lodash usuwa duplikaty z tablicy

232

To są moje dane:

[
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello-how-are-you',
        id: "23"    
    },
    {
        url: 'www.example.com/i-like-cats',
        id: "24"    
    },
    {
        url: 'www.example.com/i-like-pie',
        id: "25"    
    }
]

W Lodash, jak mogę usunąć obiekty ze zduplikowanymi kluczami identyfikacyjnymi? Coś z filtrem, mapą i unikalne, ale nie do końca pewne.

Mój prawdziwy zestaw danych jest znacznie większy i ma więcej kluczy, ale koncepcja powinna być taka sama.

ChrisRich
źródło

Odpowiedzi:

439

_.uniquenie działa już dla bieżącej wersji, ponieważ lodash 4.0.0 ma tę przełomową zmianę . Funkcjonalnie został podzielony na _.uniq, _.sortedUniq, _.sortedUniqBy i _.uniqBy

Możesz użyć _.uniqByalbo

_.uniqBy(data, function (e) {
  return e.id;
});

lub

_.uniqBy(data, 'id');

Dokumentacja: https://lodash.com/docs#uniqBy


Dla starszych wersji lodash (<4.0.0)

Zakładając, że dane powinny być unikalne idi twoje dane są przechowywane w datazmiennej, możesz użyć funkcji unique () w następujący sposób:

_.unique(data, function (e) {
  return e.id;
});

Lub po prostu

_.uniq(data, 'id');
ntalbs
źródło
1
Dokumenty Lodash 4.0.1 zmieniły to na uniqBy. Nie można sprawić, aby powyższy przykład działał przez całe życie, używając tylko uniq.
Will Lovett
2
W lodash 4.x uniq () akceptuje tylko jeden parametr, którym jest tablica. Tak jak powiedział @WillLovett, możemy użyć uniqBy (), aby rozwiązać ten problem.
ersefuril
1
O chłopie. Dlaczego, och dlaczego, to jest to, uniqco jest wymawiane jako kolejka kolanowa zamiast tego, co powinno być unique...
Josh M.
56

Możesz użyć metody lodash _.uniq Dzięki temu jest ona dostępna w aktualnej wersji lodash 4.17.2.

Przykład:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

Więcej informacji: https://lodash.com/docs/#uniqWith

zdrsoft
źródło
6
`let uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Ta metoda będzie szybsza dla dużych tablic z prostymi obiektami
tagplus5
2
tak, ale musisz przekazać atrybut jako pierwszy argument w uniqBy, co nie jest wygodne, jeśli chcesz, aby był unikalny w oparciu o kilka atrybutów, których jeszcze nie znasz
dbrrt
10

Lub po prostu użyj unii dla prostej tablicy.

_.union([1,2,3,3], [3,5])

// [1,2,3,5]
Vixson
źródło
1
Podoba mi się ta odpowiedź. Nie jest to najbardziej czytelny, ale w rzeczywistości działa, jeśli myślisz o tym z perspektywy matematyki. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr
5

Wystarczy użyć _.uniqBy () . Tworzy wolną od duplikatów wersję tablicy.

Jest to nowy sposób i dostępny od wersji 4.0.0.

_.uniqBy(data, 'id');

lub

_.uniqBy(data, obj => obj.id);
Hassan Ajaz
źródło
4

W wersji lodash 4+ można usunąć zduplikowane obiekty według określonej właściwości lub całego obiektu w następujący sposób:

var users = [
  {id:1,name:'ted'},
  {id:1,name:'ted'},
  {id:1,name:'bob'},
  {id:3,name:'sara'}
];
var uniqueUsersByID = _.uniqBy(users,'id'); //removed if had duplicate id
var uniqueUsers = _.uniqWith(users, _.isEqual);//removed complete duplicates

Źródło: https://www.codegrepper.com/?search_term=Lodash+remove+duplicates+from+array

Taylor Hawkes
źródło
1

Możesz także użyć unionBy dla 4.0.0 i nowszych, w następujący sposób: let uniques = _.unionBy (data, 'id')

Himanshu Tanwar
źródło
1

W przypadku prostej tablicy masz podejście łączące, ale możesz także użyć:

_.uniq([2, 1, 2]);
ZettaPal
źródło