【问题标题】:Find and show duplicated value [duplicate]查找并显示重复值 [重复]
【发布时间】:2013-09-24 13:40:02
【问题描述】:

任何想法如何得到这个:

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

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

【问题讨论】:

  • @Daniel,从技术上讲,这重复了另一个问题,但该问题的可接受答案有缺陷(不能正确处理三次重复),并且有几个答案误解了该问题(并提供了算法用于确定唯一性)。

标签: javascript duplicate-detection


【解决方案1】:

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

【讨论】:

  • 没问题^_^乐于帮助@maniootek
  • 这不是 O(n2) 解决方案吗?
  • 显然,这是一个 O(n^2) 解决方案。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这将获得所有个值(包括不重复的值)
    • 为什么要添加 jQuery? Make your own .indexOf
    • "这将获取所有值(包括不重复的值)" 嗯...?好吧,您的版本要快一些,因为无论如何您都指出了索引。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多