我需要检查一个JavaScript数组,看看是否有任何重复的值。最简单的方法是什么?我只需要找到复制的值是什么——实际上我不需要它们的索引,也不需要它们复制了多少次。
我知道我可以循环遍历数组并检查所有其他值是否匹配,但似乎应该有更简单的方法。
类似的问题:
获取JavaScript数组中所有唯一的值(删除重复值)
我需要检查一个JavaScript数组,看看是否有任何重复的值。最简单的方法是什么?我只需要找到复制的值是什么——实际上我不需要它们的索引,也不需要它们复制了多少次。
我知道我可以循环遍历数组并检查所有其他值是否匹配,但似乎应该有更简单的方法。
类似的问题:
获取JavaScript数组中所有唯一的值(删除重复值)
当前回答
类似于其他一些答案,但我使用forEach()使它更漂亮一点:
function find_duplicates(data) {
var track = {};
var duplicates = [];
data.forEach(function (item) {
!track[item] ? track[item] = true : duplicates.push(item);
});
return duplicates;
}
如果一个值被复制了不止一次,它的所有副本将被返回,如下所示:
find_duplicates(['foo', 'foo', 'bar', 'bar', 'bar']);
// returns ['foo', 'bar', 'bar']
这可能就是你想要的,否则你只能使用一个“唯一的”过滤。
其他回答
Var arr = [4,5,1,1,2,3,4,4,7,5,2,6,10,9]; Var sorted_arr = arr.sort(); Var len = arrr .length; Var结果= []; For (var I = 0;I < len;我+ +){ If (sorted_arr[i + 1] !== sorted_arr[i]) { results.push (sorted_arr[我]); } } document . write(结果);
使用ES6(或使用Babel或Typescipt),你可以简单地做:
var duplicates = myArray.filter(i => myArray.filter(ii => ii === i).length > 1);
https://es6console.com/j58euhbt/
这是我在重复线程(!)中的回答:
在2014年写这篇文章时,所有的例子都是for-loops或jQuery。JavaScript有完美的工具:排序、映射和缩减。
找到重复的物品
var名称=[“迈克”,“马特”,“南希”,“亚当”,“珍妮”,“南希”,“卡尔”) Const uniq = names .map((name) => { 返回{ 数:1 名称:名称 }; }) .reduce((result, b) => { Result [b.name] = (Result [b.name] || 0) + b.count; 返回结果; }, {}); const duplicate = Object.keys(uniq).filter((a) => uniq[a] > 1); console.log(副本);// ['Nancy']
更多函数式语法:
@Dmytro-Laptin指出了一些可以删除的代码。这是相同代码的一个更紧凑的版本。使用一些ES6技巧和高阶函数:
常量名称=[“迈克”,“马特”,“南希”,“亚当”,“珍妮”,“南希”,“卡尔”); Const count = names => 的名字。Reduce ((result, value) =>({… [value]:(result[value] || 0) + 1 }, {});//不要忘记初始化累加器 Const duplicate = dict => Object.keys(dict).filter((a) => dict[a] > 1); console.log (count(名称));//{迈克:1,马特:1,南希:2,亚当:1,珍妮:1,卡尔:1} console.log(副本(count(名字)));// ['Nancy']
仅ES5(即,它需要一个filter() polyfill用于IE8及以下):
var arrayToFilter = [ 4, 5, 5, 5, 2, 1, 3, 1, 1, 2, 1, 3 ];
arrayToFilter.
sort().
filter( function(me,i,arr){
return (i===0) || ( me !== arr[i-1] );
});
类似于其他一些答案,但我使用forEach()使它更漂亮一点:
function find_duplicates(data) {
var track = {};
var duplicates = [];
data.forEach(function (item) {
!track[item] ? track[item] = true : duplicates.push(item);
});
return duplicates;
}
如果一个值被复制了不止一次,它的所有副本将被返回,如下所示:
find_duplicates(['foo', 'foo', 'bar', 'bar', 'bar']);
// returns ['foo', 'bar', 'bar']
这可能就是你想要的,否则你只能使用一个“唯一的”过滤。