var arr = ['test0','test2','test0'];
Run Code Online (Sandbox Code Playgroud)
与上面一样,有两个相同的条目,其值为"test0",如何最有效地检查它?
Guf*_*ffa 15
如果对数组进行排序,则重复项彼此相邻,以便于查找:
arr.sort();
var last = arr[0];
for (var i=1; i<arr.length; i++) {
if (arr[i] == last) alert('Duplicate : '+last);
last = arr[i];
}
Run Code Online (Sandbox Code Playgroud)
这将在任何阵列上完成工作,并且可能对处理一般情况(在任何可能的数组中找到重复)进行尽可能优化.对于更具体的情况(例如,只包含字符串的数组),您可以做得更好.
function hasDuplicate(arr) {
var i = arr.length, j, val;
while (i--) {
val = arr[i];
j = i;
while (j--) {
if (arr[j] === val) {
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这里有很多答案,但并不是所有人都“感觉”不错...所以我会戴上帽子。
如果您使用lodash:
function containsDuplicates(array) {
return _.uniq(array).length !== array.length;
}
Run Code Online (Sandbox Code Playgroud)
如果可以使用ES6集,它将变成:
function containsDuplicates(array) {
return array.length !== new Set(array).size
}
Run Code Online (Sandbox Code Playgroud)
使用香草javascript:
function containsDuplicates(array) {
return array
.sort()
.some(function (item, i, items) {
return item === items[i + 1]
})
}
Run Code Online (Sandbox Code Playgroud)
但是,有时您可能需要检查项目是否在某个字段上重复。
这就是我的处理方式:
containsDuplicates([{country: 'AU'}, {country: 'UK'}, {country: 'AU'}], 'country')
function containsDuplicates(array, attribute) {
return array
.map(function (item) { return item[attribute] })
.sort()
.some(function (item, i, items) {
return item === items[i + 1]
})
}
Run Code Online (Sandbox Code Playgroud)
当找到第一个重复项时循环停止:
function has_duplicates(arr) {
var x = {}, len = arr.length;
for (var i = 0; i < len; i++) {
if (x[arr[i]]) {
return true;
}
x[arr[i]] = true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
编辑(修复“toString”问题):
function has_duplicates(arr) {
var x = {}, len = arr.length;
for (var i = 0; i < len; i++) {
if (x[arr[i]] === true) {
return true;
}
x[arr[i]] = true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这将纠正 has_duplicates(['toString']) 的情况;ETC..