Как получить дубликаты в массиве JavaScript с помощью Underscore

У меня есть массив, для которого мне нужны элементы, которые дублируются, и печатать элементы на основе определенного свойства. Я знаю, как получить уникальные элементы, используя underscore.js, но мне нужно найти дубликаты вместо уникальных значений

var somevalue=[{name:"john",country:"spain"},{name:"jane",country:"spain"},{name:"john",country:"italy"},{name:"marry",country:"spain"}]


var uniqueList = _.uniq(somevalue, function (item) {
        return item.name;
    })

Это возвращает:

[{name:"jane",country:"spain"},{name:"marry",country:"spain"}] 

но мне действительно нужно противоположное

[{name:"john",country:"spain"},{name:"john",country:"italy"}]

javascript,underscore.js,

3

Ответов: 3


3 принят

Используйте .filter () и .where () для исходного массива по значениям из массива uniq и получения повторяющихся элементов.

var uniqArr = _.uniq(somevalue, function (item) {
    return item.name;
});

var dupArr = [];
somevalue.filter(function(item) {
    var isDupValue = uniqArr.indexOf(item) == -1;

    if (isDupValue)
    {
        dupArr = _.where(somevalue, { name: item.name });
    }
});

console.log(dupArr);

скрипка

Обновлен Второй способ, если у вас есть более одного дублирующего элемента и более чистый код.

var dupArr = [];
var groupedByCount = _.countBy(somevalue, function (item) {
    return item.name;
});

for (var name in groupedByCount) {
    if (groupedByCount[name] > 1) {
        _.where(somevalue, {
            name: name
        }).map(function (item) {
            dupArr.push(item);
        });
    }
};

Посмотрите скрипку


10

Подход, основанный исключительно на подчеркивании:

_.chain(somevalue).groupBy('name').filter(function(v){return v.length > 1}).flatten().value()

Это приведет к созданию массива всех дубликатов, поэтому каждый дубликат будет в массиве вывода столько раз, сколько он дублируется. Если вам нужна только одна копия каждого дубликата, вы можете просто добавить ее .uniq()в цепочку:

_.chain(somevalue).groupBy('name').filter(function(v){return v.length > 1}).uniq().value()

Не знаю, как это работает, но мне нравятся мои одни лайнеры ... :-)


0

Вот как я сделал то же самое:

_.keys(_.pick(_.countBy(somevalue, b=> b.name), (value, key, object) => value > 1))

JavaScript, underscore.js,
Похожие вопросы