Подтвердить что ты не робот

Как я могу получить уникальный массив на основе свойства объекта с помощью подчеркивания

У меня есть массив объектов, и я хочу получить из него новый массив, который основан только на одном свойстве, есть ли простой способ достичь этого?

Eg.

[ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]

Приведёт к тому, что два объекта с именем = bill удаляются один раз.

4b9b3361

Ответ 1

Используйте uniq функцию

var destArray = _.uniq(sourceArray, function(x){
    return x.name;
});

Из документов:

Производит дублируемую версию массива, используя === для проверки равенства объектов. Если вы заранее знаете, что массив отсортирован, передача true для isSorted будет выполнять гораздо более быстрый алгоритм. Если вы хотите вычислить уникальные элементы на основе преобразования, передайте функцию итератора.

В приведенном выше примере функция использует имя объекта для определения уникальности.

Ответ 2

Если вы предпочитаете делать что-либо самостоятельно без Lodash и не получая подробных данных, попробуйте этот фильтр uniq с дополнительным uniq по свойству:

const uniqFilterAccordingToProp = function (prop) {
    if (prop)
        return (ele, i, arr) => arr.map(ele => ele[prop]).indexOf(ele[prop]) === i
    else
        return (ele, i, arr) => arr.indexOf(ele) === i
}

Затем используйте его следующим образом:

const obj = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]
obj.filter(uniqFilterAccordingToProp('abc'))

Или для простых массивов просто опустите параметр, не забывая при этом вызвать:

[1,1,2].filter(uniqFilterAccordingToProp())

Ответ 3

Если вы хотите проверить все свойства, тогда lodash 4 поставляется с _. uniqWith (sourceArray, _.isEqual)

Ответ 4

Если вам нужно чистое решение для JavaScript:

var uniqueProperties = {};

var notUniqueArray = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ];


for(var object in notUniqueArray){
   uniqueProperties[notUniqueArray[object]['name']] = notUniqueArray[object]['id'];
}

var uniqiueArray = [];

for(var uniqueName in uniqueProperties){
   uniqiueArray.push(
     {id:uniqueProperties[uniqueName],name:uniqueName});
}

//uniqiueArray