代码之家  ›  专栏  ›  技术社区  ›  TK.

在JavaScript中从数组中提取最重复的值(使用jQuery)

  •  2
  • TK.  · 技术社区  · 16 年前

    我有几个数组要处理。我需要从每个数组中提取最重复的值。

    从 [3, 7, 7, 7] ,我需要找到值 7 [3, 7, 7, 7] . 所有的值都是一个数字。

    我环顾了一下网络。我找到了几种方法使数组成为 uniq() . 但是我还没有找到一种方法来获得重复值。我正在使用jQuery,但是对于这个任务,原始JavaScript是可以的。

    4 回复  |  直到 16 年前
        1
  •  8
  •   Max Shawabkeh    16 年前

    var nums = [3, 7, 7, 7];
    var freqs = {};
    var max_index;
    var max_value = -1/0; // Negative infinity.
    
    $.each(nums, function(i, v) {
      if (freqs[v] != undefined) {
        freqs[v]++;
      } else {
        freqs[v] = 1;
      }
    });
    $.each(freqs, function(num, freq) {
      if (freq > max_value) {
        max_value = freq;
        max_index = num;
      }
    });
    
    if (max_index != undefined) {
      alert("Most common element is " + max_index + " with " + max_value + " repetition(s).");
    }
    ​
    
        2
  •  5
  •   Nick Craver    13 年前

    下面是一个仅使用JavaScript的更简单、更快的版本:

    var arr = [3, 7, 7, 7, 10, 10, 8, 5, 5, 5, 5, 20, 20, 1];
    var counts = {}, max = 0, res;
    for (var v in arr) {
      counts[arr[v]] = (counts[arr[v]] || 0) + 1;
      if (counts[arr[v]] > max) { 
        max = counts[arr[v]];
        res = arr[v];
      }
    }
    alert(res + " occurs " + counts[res] + " times");
    

    请注意,这是一个更有效的方法,因为您只需在数据上循环一次,如果您要对非常大的数组进行排序,这将开始起作用。

        3
  •  3
  •   Xavi Arik G    12 年前

    下面是一个使用javascript的快速示例:

    function mostFrequent(arr) {
        var uniqs = {};
    
        for(var i = 0; i < arr.length; i++) {
            uniqs[arr[i]] = (uniqs[arr[i]] || 0) + 1;
        }
    
        var max = { val: arr[0], count: 1 };
        for(var u in uniqs) {
            if(max.count < uniqs[u]) { max = { val: u, count: uniqs[u] }; }
        }
    
        return max.val;
    }
    

    做 有了先验知识(例如数组是排序的,只包含1和0),就可以设计一个运行时间为n的一小部分的算法;虽然从技术上讲,它的复杂性仍然是O(n)。

        4
  •  1
  •   kennebec    16 年前
    Array.prototype.mostFreq=function(){
     var what, a= this.concat(), ax, freq,
     count, max=0, limit= a.length/2;
     while(a.length){
      what= a.shift();
      count=1; 
      while((ax= a.indexOf(what))!= -1){
       a.splice(ax,1); // remove counted items  
       ++count;
      }
      // if any item has more than half the array, quit counting
      if(count> limit) return what; 
      if(count> max){
       freq= what;
       max= count;
      }
     }
     return freq;
    }
    var a=[1,1,2,5,4,2,7,7,1,1,1,3,7,7,3,4,3,7,3,5,6,2,3,1,1,7,7,2,4,3,6,7,6,6]
    alert(a.mostFreq())
    
        5
  •  0
  •   gaetanoM    7 年前

    另一个解决方案可以基于 Array.reduce() :

    var arr = [1,1,2,5,4,2,10,10,1,1,1,3,10,10,3,4,3,10,3,5,6,2,3,1,1,10,10,2,4,3,6,10,6,6];
    
    var result = arr.reduce(function(acc, e) {
        acc[e] = (acc[e] || 0) + 1;
        if (acc[e] > acc.mostFreq.freq) {
            acc.mostFreq.value = e;
            acc.mostFreq.freq = acc[e];
        }
        return acc;
    }, {"mostFreq": {"value": 0, "freq": 0}}).mostFreq;
    
    console.log('The most duplicated elements is: ' + JSON.stringify(result));