我有这样的数组:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
我想过滤它有:
var bar = [ { "a" : "1" }, { "b" : "2" }];
我尝试使用 _.uniq,但我猜因为{ "a" : "1" }
它不等于自身,所以它不起作用。有什么方法可以为下划线 uniq 提供一个覆盖的 equals 函数吗?
我有这样的数组:
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
我想过滤它有:
var bar = [ { "a" : "1" }, { "b" : "2" }];
我尝试使用 _.uniq,但我猜因为{ "a" : "1" }
它不等于自身,所以它不起作用。有什么方法可以为下划线 uniq 提供一个覆盖的 equals 函数吗?
.uniq/ .unique 接受回调
var list = [{a:1,b:5},{a:1,c:5},{a:2},{a:3},{a:4},{a:3},{a:2}];
var uniqueList = _.uniq(list, function(item, key, a) {
return item.a;
});
// uniqueList = [Object {a=1, b=5}, Object {a=2}, Object {a=3}, Object {a=4}]
笔记:
另一个例子: 使用回调从列表中提取汽车品牌、颜色
如果您想根据 id 删除重复项,您可以执行以下操作:
var res = [
{id: 1, content: 'heeey'},
{id: 2, content: 'woah'},
{id: 1, content:'foo'},
{id: 1, content: 'heeey'},
];
var uniques = _.map(_.groupBy(res,function(doc){
return doc.id;
}),function(grouped){
return grouped[0];
});
//uniques
//[{id: 1, content: 'heeey'},{id: 2, content: 'woah'}]
实施Shiplu的答案。
var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];
var x = _.uniq( _.collect( foo, function( x ){
return JSON.stringify( x );
}));
console.log( x ); // returns [ { "a" : "1" }, { "b" : "2" } ]
当我有一个属性 id 时,这是我用下划线表示的首选方式:
var x = [{i:2}, {i:2, x:42}, {i:4}, {i:3}];
_.chain(x).indexBy("i").values().value();
// > [{i:2, x:42}, {i:4}, {i:3}]
使用下划线唯一的lib 以下对我有用,我根据 _id 使列表唯一,然后返回 _id 的字符串值:
var uniqueEntities = _.uniq(entities, function (item, key, a) {
return item._id.toString();
});