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

4

我有一个数组,需要找出其中重复的项,并根据特定属性打印这些重复的项。我知道可以使用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个回答

14

一种完全基于下划线的方法是:

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

我不知道这个表现如何,但我确实喜欢我的那些独白...:-)


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

示例代码

更新 第二种方法适用于有多个重复项且代码更加简洁。

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


你的小提琴几乎是坏掉的。 - u.k
为什么?请查看控制台日志。 - Igor Semin
请求是为了重复项。 - u.k
这正是我所需要的,而且非常酷。非常感谢,Igor。 - Abhishek Dutta

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

//从这里你将得到所需的输出


2
欢迎来到Stack Overflow!感谢您提供这段代码片段,它可能会提供一些有限的即时帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并且使其对未来遇到类似问题的读者更加有用。请编辑您的答案以添加一些解释,包括您所做出的假设。 - Blue

0

这是我如何完成相同的事情:

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


0

chmac的回答进行更正。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接