查找并显示重复的值

时间:2013-09-24 13:40:02

标签: javascript duplicate-detection

任何想法如何得到这个:

var MyArr = [0,1,2,3,"something",44,661,3,1,"something"]
var Results = [1,3,"something"]

我只是想在我的数组中找到重复的值。

4 个答案:

答案 0 :(得分:2)

使用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);
    }
});

答案 1 :(得分:1)

具有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;
}

答案 2 :(得分:0)

您可以将每个值存储在一个新数组中,然后在向此类数组添加新项目之前检查它是否已存在,并返回结果。使用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()方法

答案 3 :(得分:0)

您可以使用属性为集合元素且其值为出现次数的对象来模拟计数集。因此,您可以将数组转换为计数集,并读取计数为2或更多的元素。 (仅当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 ;
}) ;