如何使用Underscore在JavaScript数组中获取重复项

时间:2015-01-09 06:00:15

标签: javascript underscore.js

我有一个数组,我需要重复的项目,并根据特定属性打印项目。我知道如何使用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"}]

5 个答案:

答案 0 :(得分:12)

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

_.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()

不知道这是如何表现的,但我确实喜欢我的单排......: - )

答案 1 :(得分:4)

使用.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);

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

答案 2 :(得分:0)

这是我做过的相同事情:

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

答案 3 :(得分:0)

9/7

//从这里您将获得所需的输出

答案 4 :(得分:0)

更正chmac's的答案。

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

使用唯一函数之前,必须先将值展平