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替换uniqBy以uniq用于Lodash <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)
这里有正确答案
javascript-lodash - 创建一个基于多个属性的唯一列表。
供参考 var result = _.uniqBy(list, v => [v.id, v.sequence].join());