使用lodash检查数组是否具有重复值

nac*_*son 20 javascript lodash

您认为使用lodash实用程序编写函数以便检查数组是否存在重复值时,您认为最好(最好可以解释为最可读或最高效,您的选择)的方法.

我想输入['foo', 'foo', 'bar']并返回函数true.并输入['foo', 'bar', 'baz']并具有返回功能false.

age*_*hun 43

你可以试试这段代码:

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));
Run Code Online (Sandbox Code Playgroud)
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.1.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以检查_.some数组中的元素在数组中查找时没有返回自己的位置.换句话说,至少有一个元素在数组中具有较早的匹配.

function hasDuplicates(array) {
    return _.some(array, function(elt, index) { 
        return array.indexOf(elt) !== index; 
    });
}
Run Code Online (Sandbox Code Playgroud)

也许这比_.uniq解决方案更快,因为它将立即识别第一个重复元素,而无需计算整个唯一的数组.

或者,根据您的编码风格和对可读性的要求,以及为简洁起见,您希望使用ES6箭头功能:

var earlierMatch  = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是一个用于检查重复项的 O(n^2) 算法。我不会称之为挑剔,更多的是一个重大缺陷。 (2认同)

Akr*_*ion 8

从 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]))
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,这在某种程度上否定了 lodash 的使用。