如何使用下划线在 JavaScript 数组中获取重复项

How to get duplicates in a JavaScript Array using 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"}]

根据 uniq 数组中的值对源数组使用 .filter() 和 .where() 并获取重复项。

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);

Fiddle

已更新 第二种方法,如果你有多个重复项,并且代码更干净。

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);
        });
    }
};

Look fiddle

纯粹基于下划线的方法是:

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

这将生成一个包含所有重复项的数组,因此每个重复项在输出数组中出现的次数与它被复制的次数一样多。如果你只想要每个副本的 1 个副本,你可以简单地向链中添加一个 .uniq(),如下所示:

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

不知道它的性能如何,但我确实喜欢我的衬垫...:-)

这是我做同样事情的方法:

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

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.country;})

//从这里你会得到需要的输出

更正 答案。

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

在使用唯一函数之前需要将值展平