我有一个数组,我需要重复的项目,并根据特定属性打印项目。我知道如何使用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"}]
答案 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);
<强>更新强> 第二种方法,如果你有多个重复的项目,以及更干净的代码。
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);
});
}
};
答案 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()
使用唯一函数之前,必须先将值展平