Lodash从数组中删除重复项


232

这是我的数据:

[
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello-how-are-you',
        id: "23"    
    },
    {
        url: 'www.example.com/i-like-cats',
        id: "24"    
    },
    {
        url: 'www.example.com/i-like-pie',
        id: "25"    
    }
]

使用Lodash,如何删除具有重复ID键的对象?带有过滤器,地图和独特内容的东西,但不是很确定。

我的真实数据集更大,并且具有更多的键,但是概念应该相同。

Answers:


439

_.unique不适用于当前版本,因为lodash 4.0.0具有此重大更改。在功能上分为_.uniq,_。sortedUniq,_。sortedUniqBy和_.uniqBy

你可以使用_.uniqBy无论是

_.uniqBy(data, function (e) {
  return e.id;
});

要么

_.uniqBy(data, 'id');

文档:https : //lodash.com/docs#uniqBy


对于lodash的旧版本(<4.0.0)

假定数据应该是唯一的,id并且您的数据存储在data变量中,则可以使用unique()函数,如下所示:

_.unique(data, function (e) {
  return e.id;
});

或者简单地

_.uniq(data, 'id');

1
lodash 4.0.1文档已将其更改为uniqBy。仅使用uniq无法使以上示例在我的生命中起作用。
Will Lovett

2
使用lodash 4.x,uniq()仅接受一个参数,它是一个数组。因此,正如@WillLovett所说,我们可以使用uniqBy()解决此问题。
ersefuril '16

1
好家伙。为什么,为什么呢,uniq这是发音为“ 你的膝盖队列”,而不是应为的unique……...
Josh M.18年

56

您可以使用lodash方法_.uniqWith,在lodash 4.17.2的当前版本中可用。

例:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

更多信息:https//lodash.com/docs/#uniqWith


6
`let uniqObjects = _.uniqBy(docs,function(e){return ex + ey;}); `对于具有简单对象的大型数组,此方法将更快
tagplus5

2
是的,但是您必须使用uniqBy将属性作为第一个参数传递,如果您希望基于几个尚不知道的属性来使它唯一,这将不方便
dbrrt

10

或简单地使用union,以获得简单数组。

_.union([1,2,3,3], [3,5])

// [1,2,3,5]

1
我喜欢这个答案。它不是最易读的代码,但是如果您从数学角度考虑它,它实际上会起作用。_.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr




1

对于简单数组,您可以使用并集方法,但也可以使用:

_.uniq([2, 1, 2]);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.