下划线/ lodash由多个属性唯一

Jef*_*rey 26 javascript unique underscore.js lodash

我有一个带有重复项的对象数组,我正在尝试获得一个唯一的列表,其中唯一性由对象属性的子集定义.例如,

{a:"1",b:"1",c:"2"}
Run Code Online (Sandbox Code Playgroud)

我想c在唯一性比较中忽略.

我可以做点什么

_.uniq(myArray,function(element) { return element.a + "_" + element+b});
Run Code Online (Sandbox Code Playgroud)

我希望我能做到

_.uniq(myArray,function(element) { return {a:element.a, b:element.b} });
Run Code Online (Sandbox Code Playgroud)

但这不起作用.是否有类似我可以做的事情,或者如果我正在比较多个属性,我是否需要创建对象的可比表示?

voi*_*hos 31

不幸的是,似乎没有一种直接的方法可以做到这一点.如果没有为此编写自己的函数,则需要返回可以直接比较相等的内容(如第一个示例中所示).

一种方法是只.join()需要您需要的属性:

_.uniqBy(myArray, function(elem) { return [elem.a, elem.b].join(); });
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用_.pick_.omit删除任何不需要的内容.从那里,你可以使用_.values一个.join(),甚至只是JSON.stringify:

_.uniqBy(myArray, function(elem) {
    return JSON.stringify(_.pick(elem, ['a', 'b']));
});
Run Code Online (Sandbox Code Playgroud)

请记住,就属性顺序而言,对象不是确定性的,因此您可能只想坚持使用显式数组方法.

PS替换uniqByuniq用于Lodash <4

  • lodash 4带有`_.uniqWith(myArray,_. isEqual)` (7认同)
  • 使用`join('')`充满了漏洞(例如`[1,23]`和`[12,3]`). (4认同)

Ree*_*kle 19

使用 Lodash 的uniqWith方法:

_.uniqWith(array, [comparator])

这个方法很像,_.uniq除了它接受comparator哪个被调用来比较 的元素array。结果值的顺序由它们在数组中出现的顺序决定。比较器用两个参数调用:(arrVal, othVal)

comparator返回时true,这些项目被认为是重复的,只有第一次出现的项目才会包含在新数组中。


示例:
我有一个带有latitude和的位置列表longitude——其中一些是相同的——我想查看唯一位置的列表:

const locations = [
  {
    name: "Office 1",
    latitude: -30,
    longitude: -30
  },
  {
    name: "Office 2",
    latitude: -30,
    longitude: 10
  },
  {
    name: "Office 3",
    latitude: -30,
    longitude: 10
  }
];

const uniqueLocations = _.uniqWith(
  locations,
  (locationA, locationB) =>
    locationA.latitude === locationB.latitude &&
    locationA.longitude === locationB.longitude
);

// Result has Office 1 and Office 2
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案 (3认同)

Mat*_*ias 5

这里有正确答案

javascript-lodash - 创建一个基于多个属性的唯一列表

供参考 var result = _.uniqBy(list, v => [v.id, v.sequence].join());

  • 这对我来说非常有用,谢谢! (2认同)