use*_*495 69 javascript duplicates
如何检查数组是否具有重复值?
如果数组中的某些元素相同,则返回true.否则,返回false.
['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)
Dom*_*nic 172
如果您有一个ES2015环境(截至撰写本文时:io.js,IE11,Chrome,Firefox,WebKit),那么以下内容将会起作用,并且速度很快(即O(n)):
function hasDuplicates(array) {
return (new Set(array)).size !== array.length;
}
Run Code Online (Sandbox Code Playgroud)
如果您只需要数组中的字符串值,则以下内容将起作用:
function hasDuplicates(array) {
var valuesSoFar = Object.create(null);
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (value in valuesSoFar) {
return true;
}
valuesSoFar[value] = true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我们使用"哈希表",valuesSoFar
其键是我们到目前为止在数组中看到的值.我们使用查找in
来查看是否已经发现了该值; 如果是这样,我们会退出循环并返回true
.
如果您需要的函数不仅仅适用于字符串值,则以下方法可行,但效果不佳; 它是O(n 2)而不是O(n).
function hasDuplicates(array) {
var valuesSoFar = [];
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (valuesSoFar.indexOf(value) !== -1) {
return true;
}
valuesSoFar.push(value);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
区别在于我们使用数组而不是哈希表valuesSoFar
,因为JavaScript"哈希表"(即对象)只有字符串键.这意味着我们失去了O(1)查找时间in
,而不是获得O(n)查找时间indexOf
.
小智 19
您可以使用 SET 删除重复项并进行比较,如果将数组复制到集合中,它将删除所有重复项。然后简单地将数组的长度与集合的大小进行比较。
function hasDuplicates(a) {
const noDups = new Set(a);
return a.length !== noDups.size;
}
Run Code Online (Sandbox Code Playgroud)
Kor*_*rad 17
ES6 的单线解决方案
const arr1 = ['hello','goodbye','hey']
const arr2 = ['hello','goodbye','hello']
const hasDuplicates = (arr) => arr.length !== new Set(arr).size;
console.log(hasDuplicates(arr1)) //return false because no duplicates exist
console.log(hasDuplicates(arr2)) //return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)
const s1 = ['hello','goodbye','hey'].some((e, i, arr) => arr.indexOf(e) !== i)
const s2 = ['hello','goodbye','hello'].some((e, i, arr) => arr.indexOf(e) !== i);
console.log(s1) //return false because no duplicates exist
console.log(s2) //return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)
另一种方法(也适用于数组1 中的对象/数组元素)可能是2:
function chkDuplicates(arr,justCheck){
var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = [];
arrtmp.sort();
while(len--){
var val = arrtmp[len];
if (/nul|nan|infini/i.test(String(val))){
val = String(val);
}
if (tmp[JSON.stringify(val)]){
if (justCheck) {return true;}
dupes.push(val);
}
tmp[JSON.stringify(val)] = true;
}
return justCheck ? false : dupes.length ? dupes : null;
}
//usages
chkDuplicates([1,2,3,4,5],true); //=> false
chkDuplicates([1,2,3,4,5,9,10,5,1,2],true); //=> true
chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true
chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true); //=> false
chkDuplicates([1,2,3,4,5,1,2]); //=> [1,2]
chkDuplicates([1,2,3,4,5]); //=> null
Run Code Online (Sandbox Code Playgroud)
1需要一个支持 JSON 的浏览器,如果不支持,则需要一个JSON 库。
2 编辑:函数现在可用于简单检查或返回重复值数组