你认为最好的(最好的解释是最可读或最高效,你的选择)使用lodash实用程序编写函数以检查数组是否有重复值。
我想输入['foo', 'foo', 'bar']
并让函数返回true
。输入['foo', 'bar', 'baz']
并让函数返回false
。
答案 0 :(得分:39)
您可以尝试以下代码:
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>
&#13;
答案 1 :(得分:8)
您可以检查数组中有_.some
元素,当在数组中查找时,该元素不会返回自己的位置。换句话说,至少有一个元素在数组中具有较早的匹配。
function hasDuplicates(array) {
return _.some(array, function(elt, index) {
return array.indexOf(elt) !== index;
});
}
也许这比_.uniq
解决方案更快,因为它将立即识别第一个重复元素,而无需计算整个唯一数据。
或者,根据您的编码风格和对可读性的要求,以及为简洁起见,您希望使用ES6箭头功能:
var earlierMatch = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
答案 2 :(得分:2)
嗯,总有。 lodash的_.uniq()功能。该函数实际上返回一个只包含唯一值的新数组,因此检查数组的长度是否已更改将使您获得'true'或'false'值以自行返回,我相信。
答案 3 :(得分:2)
我不知道lodash,但我提交:
_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
到目前为止提出的所有解决方案的问题在于整个输入数组需要处理以获得答案,即使答案在数组的前2个元素中是显而易见的。
答案 4 :(得分:0)
从ES6开始,您可以简单地使用Set,从而变成:
let hasDublicates = arr => new Set(arr).size != arr.length
console.log(hasDublicates([5,3,2,1,2,1,2,1]))
console.log(hasDublicates([1,2,3,4,5]))
在这种特殊情况下,这会否定使用lodash。
答案 5 :(得分:0)
无需使用lodash
,请改用以下代码:
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}