任何想法如何得到这个:
var MyArr = [0,1,2,3,"something",44,661,3,1,"something"]
var Results = [1,3,"something"]
我只想在我的数组中找到重复的值。
任何想法如何得到这个:
var MyArr = [0,1,2,3,"something",44,661,3,1,"something"]
var Results = [1,3,"something"]
我只想在我的数组中找到重复的值。
使用 for 循环:
var Results = [];
MyArr.forEach(function(el, idx){
//check if value is duplicated
var duplicated = MyArr.indexOf(el, idx + 1) > 0;
if(duplicated && Results.indexOf(el) < 0) {
//duplicated and not in array
Results.push(el);
}
});
O(n) 时间和 O(n) 空间的解。例子:
Results = duplicates(MyArr);
使用地图数据结构。只有在 MyArr 中有字符串或数字时才有效;
function duplicates(input) {
var results = [],
_map = {};
for (var i in input) {
if (typeof _map[input[i]] == "undefined") {
_map[input[i]] = 1;
}
else {
_map[input[i]]++;
}
}
for (var argument in _map) {
if (_map[argument] > 1) {
results.push(argument);
}
}
return results;
}
PS:因为 _map[input[i]] 需要 O(1) 时间,因为它是一个哈希表,但是 indexOf() 需要 O(n) 时间。PS2:另一种具有较低常数的解决方案:
function duplicates(input) {
var results = [],
_map = {};
WAS = 1,
SKIP = -1;
for (var i in input) {
if (typeof _map[input[i]] == "undefined") {
_map[input[i]] = WAS;
}
else if (_map[input[i]] == WAS) {
_map[input[i]] = SKIP;
results.push(input[i]);
}
}
return results;
}
您可以将每个值存储在一个新数组中,并在将新项添加到此类数组之前检查它是否已经存在,然后返回结果。使用 Array.forEach() 的示例:
var myArr = [1,2,3,2];
var results = [];
myArr.forEach(function(item) {
if (results.indexOf(item) < 0) {
results.push(item);
}
});
如果您只想要重复的值,您可以使用非常相似的方法并使用 Array.filter。
注意:注意 Array.indexOf() 不适用于 IE8,例如,您可以使用jQuery.inArray()方法
您可以使用一个对象来模拟一个计数集,该对象的属性是集合的元素,其值是出现的次数。因此,您可以将数组转换为计数集并读取计数为两个或更多的元素。(这仅在 MyArr 的元素是字符串或数字时才有效。)
所以试试这个:
var counts = {} ;
MyArr.forEach(function(el){
counts[el] = counts[el]==undefined ? 1 : counts[el]+1 ;
});
var Results = Object.keys(counts).filter(function(el){
return counts[el] > 1 ;
}) ;