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

С Lodash, как я могу удалить объекты с дубликатами идентификаторов ключей? Что-то с фильтром, картой и уникальным, но не совсем уверен.

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

Ответы:


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 (), например:

_.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
`let 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]
Сепер

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.