Javascript 使用lodash检查数组是否具有重复值
为了检查数组中是否存在重复值,您认为使用lodash实用程序编写函数的最佳方法是什么(最好的方法可以解释为最可读或最性能,由您选择) 我想输入Javascript 使用lodash检查数组是否具有重复值,javascript,lodash,Javascript,Lodash,为了检查数组中是否存在重复值,您认为使用lodash实用程序编写函数的最佳方法是什么(最好的方法可以解释为最可读或最性能,由您选择) 我想输入['foo','foo','bar']并让函数返回true。然后输入['foo'、'bar'、'baz']并让函数返回false您可以尝试以下代码: 函数有重复项(a){ 返回uq(a).length!==a.length; } 变量a=[1,2,1,3,4,5]; var b=[1,2,3,4,5,6]; (a),,,,和(b)重复 好吧,总是有。洛达
['foo','foo','bar']
并让函数返回true
。然后输入['foo'、'bar'、'baz']
并让函数返回false
您可以尝试以下代码:
函数有重复项(a){
返回uq(a).length!==a.length;
}
变量a=[1,2,1,3,4,5];
var b=[1,2,3,4,5,6];
(a),,,,和(b)重复代码>
好吧,总是有。洛达斯的功能。该函数实际上返回一个只包含唯一值的新数组,因此检查数组的长度是否已更改将使您自己返回“真”或“假”值。我不知道lodash,但我提交:
_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
到目前为止提出的所有解决方案的问题是,整个输入数组都需要处理才能得到答案,即使答案从数组的前两个元素中是显而易见的。您可以检查数组中是否存在。数组中的某些元素在数组中查找时不返回自己的位置。换句话说,至少有一个元素在数组的前面具有匹配项
function hasDuplicates(array) {
return _.some(array, function(elt, index) {
return array.indexOf(elt) !== index;
});
}
这可能比\uq.uniq
解决方案快,因为它将立即识别第一个重复的元素,而无需计算整个唯一数组
或者,根据您的编码风格和可读性要求,如果您希望使用ES6箭头函数来简化:
var earlierMatch = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
从ES6开始,您可以简单地使用它,使其成为:
let hasdeplicates=arr=>new Set(arr).size!=棱长
日志(hasDuplicates([5,3,2,1,2,1,2,1]))
console.log(hasDuplicates([1,2,3,4,5]))
无需使用lodash
,请使用以下代码:
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}
与==
相对的===
有什么特殊原因吗?在这种特殊情况下,这并不重要。我改为==
。非常感谢。当然可以,但为了挑剔,OP要求使用hasdeplicates
函数,而不是hasnodupplicates
。改为hasdeplicates()
简短准确。大量使用索引
!!吹毛求疵:indexOf
(O(n))在some
(O(n))->O(n2)中。是的,这是一个检查重复项的O(n^2)算法。我不认为这是吹毛求疵,更多的是一个重大缺陷。从lodash的第4版开始,。中的任何一个都不赞成,而赞成使用