我需要检查JavaScript数组是否有重复值。最简单的方法是什么?我只需要找出重复的值 - 我不需要它们的索引或重复次数。
我知道可以循环遍历数组并检查其他值是否匹配,但似乎应该有更简单的方法。
我需要检查JavaScript数组是否有重复值。最简单的方法是什么?我只需要找出重复的值 - 我不需要它们的索引或重复次数。
我知道可以循环遍历数组并检查其他值是否匹配,但似乎应该有更简单的方法。
function removeDuplicates(links) {
return _.reduce(links, function(list, elem) {
if (list.indexOf(elem) == -1) {
list.push(elem);
}
return list;
}, []);
}
这里使用了 underscore,但是 Array 也有一个 reduce
函数。
有一种非常简单的方法可以解决这个问题。如果您使用新的“Set”JavaScript命令,它可以将数组作为输入并输出仅包含唯一值的新“Set”。然后,通过比较数组的长度和集合的“size”属性,您可以看到它们是否不同。如果它们不同,那么肯定是由于重复的条目。
var array1 = ['value1','value2','value3','value1']; // contains duplicates
var array2 = ['value1','value2','value3','value4']; // unique values
console.log('array1 contains duplicates = ' + containsDuplicates(array1));
console.log('array2 contains duplicates = ' + containsDuplicates(array2));
function containsDuplicates(passedArray) {
let mySet = new Set(passedArray);
if (mySet.size !== passedArray.length) {
return true;
}
return false;
}
我认为最简单的解决方案就是使用indexOf。
以下是将唯一元素推送到数组的完整示例。
var arr = ['a','b','c','d','a','b','c','d'];
var newA = [];
for(var i = 0; i < arr.length; i++){
if(newA.indexOf(arr[i]) === -1){
newA.push(arr[i]);
}
}
function duplicates(arr) {
var duplicatesArr = [],
uniqueObj = {};
for (var i = 0; i < arr.length; i++) {
if( uniqueObj.hasOwnProperty(arr[i]) && duplicatesArr.indexOf( arr[i] ) === -1) {
duplicatesArr.push( arr[i] );
}
else {
uniqueObj[ arr[i] ] = true;
}
}
return duplicatesArr;
}
/* Input Arr: [1,1,2,2,2,1,3,4,5,3] */
/* OutPut Arr: [1,2,3] */
实际上,这个问题有很多错误的答案或需要大量额外内存(如Set)的答案,这真是遗憾。一个简洁明了的解决方案:
function findDuplicates<T>(arr: Array<T>): T[] {
//If the array has less than 2 elements there are no duplicates
const n = arr.length;
if (n < 2)
return [];
const sorted = arr.sort();
const result = [];
//Head
if (sorted[0] === sorted[1])
result.push(sorted[0]);
//Inner (Head :: Inner :: Tail)
for (let i = 1; i < n-1; i++) {
const elem = sorted[i];
if (elem === sorted[i - 1] || elem === sorted[i+1])
result.push(elem)
}
//Tail
if (sorted[n - 1] == sorted[n - 2])
result.push(sorted[n - 1]);
return result;
}
console.dir(findDuplicates(['a', 'a', 'b', 'b']));
console.dir(findDuplicates(['a', 'b']));
console.dir(findDuplicates(['a', 'a', 'a']));
console.dir(findDuplicates(['a']));
console.dir(findDuplicates([]));
使用underscore的另一种方法。Numbers是源数组,dupes具有可能重复的值。
var itemcounts = _.countBy(numbers, function (n) { return n; });
var dupes = _.reduce(itemcounts, function (memo, item, idx) {
if (item > 1)
memo.push(idx);
return memo;
}, []);
var values = [4,2,3,1,4]
// solution
const checkDuplicate = list => {
var hasDuplicate = false;
list.sort().sort((a, b) => {
if (a === b) hasDuplicate = true
})
return hasDuplicate
}
console.log(checkDuplicate(values))
var arr = [1,2,3,4,5,6,7,8,1,2,3,4,5,3,3,4];
var data = arr.filter(function(item,index,arr){
return arr.indexOf(item) != arr.lastIndexOf(item) && arr.indexOf(item) == index;
})
console.log(data );
2
时过滤数组的单循环方法,因为它返回第一个找到的重复项。var array = [5, 0, 2, 1, 2, 3, 3, 4, 4, 8, 6, 7, 9, 4],
duplicates = array.filter((h => v => (h[v] = (h[v] || 0) + 1) === 2)({}));
console.log(duplicates);
[2, 2, 3, 3, 4, 4, 4]
? - hoangfinsort
、filter
和sets
来实现这一点。
var numbers = [1,2,3,4,5,6,7,8,1,2,3,4,5,3,3,4];
var numbersSorted = numbers.sort();
let result = numbers.filter((e, i) => numbers[i] == numbers[i+1]);
result = [...new Set(result)];
console.log(result);