【发布时间】:2015-02-11 17:51:06
【问题描述】:
你们都认为使用 lodash 实用程序编写函数以检查数组中是否存在重复值的最佳方式(最好可以解释为最具可读性或最高性能,由您选择)。
我想输入['foo', 'foo', 'bar'] 并让函数返回true。然后输入['foo', 'bar', 'baz'],让函数返回false。
【问题讨论】:
标签: javascript lodash
你们都认为使用 lodash 实用程序编写函数以检查数组中是否存在重复值的最佳方式(最好可以解释为最具可读性或最高性能,由您选择)。
我想输入['foo', 'foo', 'bar'] 并让函数返回true。然后输入['foo', 'bar', 'baz'],让函数返回false。
【问题讨论】:
标签: javascript lodash
你可以试试这个代码:
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>
【讨论】:
== vs === 有什么特别的原因吗?
===。谢谢!
hasDuplicates 函数,而不是 hasNoDuplicates。
hasDuplicates()
从 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 解决方案更快,因为它会立即识别第一个重复元素,而无需计算整个唯一化数组。
或者,取决于你的编码风格和对可读性的渴望,如果你想使用 ES6 箭头函数来简洁:
var earlierMatch = (elt, index, array) => array.indexOf(elt) !== index;
var hasDuplicates = array => _.some(array, earlierMatch);
【讨论】:
indexOf!!
indexOf (O(n)) 在 some (O(n)) -> O(n2) 内。
嗯,总会有的。 lodash 的 _.uniq() 函数。该函数实际上返回一个仅包含唯一值的新数组,因此我相信检查数组的长度是否已更改将使您返回自己的“真”或“假”值。
【讨论】:
我不知道 lodash 但我提交:
_.any(_.countBy(['foo', 'foo', 'bar']), function(x){ return x > 1; });
到目前为止提出的所有解决方案的问题是,整个输入数组都需要处理才能得到答案,即使答案从数组的前 2 个元素中显而易见。
【讨论】:
_.any 被 _.some 取代
无需使用lodash,请使用以下代码:
function getDuplicates(array, key) {
return array.filter(e1=>{
if(array.filter(e2=>{
return e1[key] === e2[key];
}).length > 1) {
return e1;
}
})
}
【讨论】: