大家认为使用lodash工具编写一个函数来检查数组中是否有重复值的最佳方法是什么(最佳可解释为最易读或最高效,由您选择)。
我想输入['foo', 'foo', 'bar']
并使函数返回true
。输入['foo', 'bar', 'baz']
并使函数返回false
。
大家认为使用lodash工具编写一个函数来检查数组中是否有重复值的最佳方法是什么(最佳可解释为最易读或最高效,由您选择)。
我想输入['foo', 'foo', 'bar']
并使函数返回true
。输入['foo', 'bar', 'baz']
并使函数返回false
。
你可以尝试这段代码:
function hasDuplicates(a) {
return _.uniq(a).length !== a.length;
}
var a = [1,2,1,3,4,5];
var b = [1,2,3,4,5,6];
document.write(hasDuplicates(a), ',',hasDuplicates(b));
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>
从ES6开始,您可以简单地使用Set,因此代码变成了:
let hasDuplicates = arr => new Set(arr).size != arr.length
console.log(hasDuplicates([5,3,2,1,2,1,2,1]))
console.log(hasDuplicates([1,2,3,4,5]))
这在某种程度上抵消了在这种情况下使用lodash的作用。
您可以检查数组中是否存在_.some
元素,该元素在数组中查找时不返回自己的位置。换句话说,至少有一个元素在数组中有一个先前的匹配项。
function hasDuplicates(array) {
return _.some(array, function(elt, index) {
return array.indexOf(elt) !== index;
});
}
_.uniq
的解决方案更快,因为它可以立即识别第一个重复的元素,而无需计算整个唯一化数组。var earlierMatch = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
indexOf
的使用非常棒!! - Hrishi嗯,有一个方法可以用,就是 lodash 的 _.uniq() 函数。这个函数会返回一个只包含唯一值的新数组,所以检查数组长度是否改变可以得到你需要返回的真或假值。
_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
不需要使用 lodash
,可以使用以下代码替代:
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}
==
和===
有什么特别的原因吗? - nackjicholson===
。谢谢! - agershunhasDuplicates
函数,而不是hasNoDuplicates
。 - user663031hasDuplicates()
。 - agershun