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

Using lodash to check whether an array has duplicate values

你们认为使用 lodash 实用程序编写函数以检查数组中是否存在重复值的最佳方式(最佳可以解释为最具可读性或最高性能,由您选择)是什么。

我要输入['foo', 'foo', 'bar'],函数return true。并输入 ['foo', 'bar', 'baz'] 并具有函数 return 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>

嗯,总是有的。 lodash 的 _.uniq() 函数。该函数实际上 return 是一个仅包含唯一值的新数组,因此检查数组的长度是否已更改将使您的 'true' 或 'false' 值变为 return 你自己,我相信。

我不知道 lodash 但我提交:

_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });

目前提出的所有解决方案的问题是需要处理整个输入数组才能得到答案,即使从数组的前 2 个元素来看答案是显而易见的。

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

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);

从 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 在这种特殊情况下的使用。

无需使用lodash,请改用以下代码:

function getDuplicates(array, key) {
  return array.filter(e1=>{
    if(array.filter(e2=>{
      return e1[key] === e2[key];
    }).length > 1) {
      return e1;
    }
  })
}