Lodash видаляє дублікати з масиву


232

Це мої дані:

[
    {
        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"    
    }
]

Як Лодаш, як я можу видалити об'єкти з повторюваними ідентифікаційними ключами? Щось із фільтром, картою та унікальним, але не зовсім впевненим.

Мій реальний набір даних набагато більший і має більше ключів, але концепція повинна бути однаковою.

Відповіді:


439

_.uniqueбільше не працює для поточної версії, оскільки lodash 4.0.0 має цю неполадку . Функціонально було розбито на _.uniq, _.sortedUniq, _.sortedUniqBy та & _.uniqBy

Ви можете скористатися _.uniqByбудь-яким користувачем

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

або

_.uniqBy(data, 'id');

Документація: https://lodash.com/docs#uniqBy


Для старих версій lodash (<4.0.0)

Якщо припустити, що дані мають бути унікальними, idа ваші дані зберігаються в dataзмінній, ви можете використовувати унікальну функцію () на зразок цієї:

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

Або просто

_.uniq(data, 'id');

1
Документи lodash 4.0.1 змінили це на uniqBy. Не вдалося змусити вказаний вище приклад працювати на все життя, використовуючи лише uniq.
Буде Ловельт

2
З lodash 4.x, uniq () приймає лише один параметр, який є масивом. Отже, як сказав @WillLovett, ми можемо використовувати uniqBy () для вирішення цієї проблеми.
ersefuril

1
О, малюк. Чому, о чому, це те, uniqщо вимовляється ви - черга на коліно замість того, що має бути, unique...
Джош М.

56

Ви можете використовувати метод lodash _.uniqWith, він доступний у поточній версії lodash 4.17.2.

Приклад:

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 }]

Більше інформації: https://lodash.com/docs/#uniqWith


6
`нехай uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Цей метод буде швидшим для великих масивів з простими об'єктами
tagplus5

2
так, але вам слід передати атрибут як перший аргумент з uniqBy, що не зручно, якщо ви хочете, щоб він був унікальним на основі декількох атрибутів, які ви ще не знаєте
dbrrt

10

Або просто Використовуйте об'єднання для простого масиву.

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

// [1,2,3,5]

1
Мені подобається ця відповідь. Це не найчитабельніше, але насправді він працює, якщо думати про це з точки зору математики. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

Просто використовуйте _.uniqBy () . Це створює без копій версію масиву.

Це новий спосіб, доступний з версії 4.0.0.

_.uniqBy(data, 'id');

або

_.uniqBy(data, obj => obj.id);

4

За допомогою lodash версії 4+ ви видалите дублікати об'єктів або за певною властивістю, або за всім об'єктом на зразок:

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

Джерело: https://www.codegrepper.com/?search_term=Lodash+remove+duplicates+from+array



1

Для простого масиву у вас є підхід об'єднання, але ви також можете використовувати:

_.uniq([2, 1, 2]);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.