使用 Underscore for Javascript 删除重复对象

IT技术 javascript json underscore.js
2021-01-18 06:29:15

我有这样的数组:

var foo = [ { "a" : "1" }, { "b" : "2" }, { "a" : "1" } ];

我想过滤它有:

var bar = [ { "a" : "1" }, { "b" : "2" }];

我尝试使用 _.uniq,但我猜因为{ "a" : "1" }它不等于自身,所以它不起作用。有什么方法可以为下划线 uniq 提供一个覆盖的 equals 函数吗?

6个回答

.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}]

笔记:

  1. 用于比较的回调返回值
  2. 第一个具有唯一返回值的比较对象用作唯一
  3. underscorejs.org演示没有回调使用
  4. lodash.com显示使用情况

另一个例子: 使用回调从列表中提取汽车品牌、颜色

false不是必需的_.uniq()同样在 lodash 中,您可以像这样编写它_.uniq(a, 'a');,因为它会提取a对象上的属性
2021-03-15 06:29:15
你在jsbin 的例子可以有更新。(1) 制造:_(cars).uniq('make').map('make').valueOf() AND (2) 颜色:_(cars).uniq('color').map('color' )。的value()。您可以使颜色成熟并关闭。(所有这些,如果你升级 de lodash 使用)
2021-03-20 06:29:15
“'_.pluck' 回调简写”仅在您为 isSorted 传递值时才有效(例如_.uniq(a, false, 'a'))我 ping github/bestiejs/lodash 并且他们说问题已在边缘修复。因此,如果您不使用某个功能,请确保您拥有最新的功能。这可能不是下划线的问题。
2021-03-24 06:29:15
Iterator 听起来不是一个好名字,它是一个类似哈希的函数,用于确定每个对象的身份
2021-03-29 06:29:15
编辑以使用回调以与 lodash 文档更加一致:)
2021-03-31 06:29:15

如果您想根据 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'}]
当唯一标识符是Date. 然而这确实如此。
2021-04-03 06:29:15

实施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" } ]
顺便说一句,你是如何获得 4 个赞成票的?要获得结果的属性,您必须将每个数组值恢复为一个对象。喜欢的东西JSON.parse(x[0]).a,因为x不是对象的数组,它是一个字符串数组。此外,如果您将 b 值添加到唯一值并反转 a/b 的顺序,您的函数不再认为它们是唯一的。(例如`"{\"a\":\"1\",\"b\":2}" != "{\"b\":2,\"a\":\"1\"} ") 也许我遗漏了一些东西,但结果不应该至少有用吗?这里有一个jsbin来说明jsbin.com/utoruz/2/edit
2021-03-20 06:29:15
当我回答这个问题时,我觉得问题的重点是覆盖(a ==(=) b when a = b = {a:1}). 我的答案的重点是迭代器。我试着回答而不用担心动机,这可能是什么,对吧?(例如,也许他们想从节目中的汽车列表中提取品牌、颜色列表。jsbin.com/evodub/2/edit)干杯!
2021-03-22 06:29:15
拥有相同键但以不同顺序破坏实现的条件是正确的。但是我不确定为什么您只检查a每个对象的键,而可能存在不包含键的重复对象a但是,如果a是唯一的 id就有意义了。
2021-03-24 06:29:15
好吧,我只是再次投票,因为这回答了我关于比较嵌套数组的问题。只是在寻找如何覆盖iterator
2021-04-07 06:29:15
此外,我认为当有人提出问题提供动机时,它有助于我们给出简洁的答案。这是一场比赛,所以我更喜欢第一个,并在必要时澄清。快乐圣帕特里克节。
2021-04-13 06:29:15

当我有一个属性 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();
                                });