Underscore.js,根据键值从对象数组中删除重复项

12

我有下面这个JS数组:

var myArray = [{name:"Bob",b:"text2",c:true},
               {name:"Tom",b:"text2",c:true},
               {name:"Adam",b:"text2",c:true},
               {name:"Tom",b:"text2",c:true},
               {name:"Bob",b:"text2",c:true}
               ];

我想要消除名称值重复的索引,并重新创建一个新的数组,其中包含不同的名称,例如:

var mySubArray = [{name:"Bob",b:"text2",c:true},
                  {name:"Tom",b:"text2",c:true},
                  {name:"Adam",b:"text2",c:true},
                 ];

正如您所看到的,我删除了“Bob”和“Tom”,只留下3个不同的名字。使用 Underscore 可能吗?怎么做?


2
我非常确定这种情况需要更多的东西,而不仅仅是 _.filter。 - Dexygen
@GeorgeJempty:我尝试过 _.filter,但可能我找不到正确使用它的方法。 - user1094081
2个回答

36

使用 Underscore,可以使用自定义转换的_.uniq函数,例如类似于_.property('name')的函数或者只是'name'。正如@Gruff Bunny在评论中指出的那样:

var mySubArray = _.uniq(myArray, 'name');

这里有一个演示 http://jsfiddle.net/nikoshr/02ugrbzr/

如果你使用的是Lodash而不是Underscore,请按照@Jacob van Lingen在评论中提供的示例,使用_.uniqBy

var mySubArray = _.uniqBy(myArray, 'name')

1
你可以将“name”作为第三个参数传递给_.uniq函数。 - Gruff Bunny
2
仅返回翻译后的文本内容:并删除第二个参数,只留下_.uniq(myArray, 'name') - 刚刚窥视了underscore源代码 - Gruff Bunny
3
请注意,lodash 中的用法是:_.uniqBy(myArray, 'name'),作用是按照 name 字段去重数组元素。 - Jacob van Lingen

3
另一个答案肯定是最好的,但这里还有另外一个不太长的答案,也可以让您接触更多下划线方法,如果您有兴趣学习:
var mySubArray = []

_.each(_.uniq(_.pluck(myArray, 'name')), function(name) {
    mySubArray.push(_.findWhere(myArray, {name: name}));
})

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