获取数组中出现次数最多的项

IT技术 javascript arrays algorithm search
2021-03-11 19:00:45
var store = ['1','2','2','3','4'];

我想找出2在数组出现最多的那个。我该怎么做?

6个回答

我会做这样的事情:

var store = ['1','2','2','3','4'];
var frequency = {};  // array of frequency.
var max = 0;  // holds the max frequency.
var result;   // holds the max frequency element.
for(var v in store) {
        frequency[store[v]]=(frequency[store[v]] || 0)+1; // increment frequency.
        if(frequency[store[v]] > max) { // is this frequency > max so far ?
                max = frequency[store[v]];  // update max.
                result = store[v];          // update result.
        }
}
+1 - 非常好......但我会使用for循环来阻止数组对象具有属性的极端情况:jsfiddle.net/9eJd3
2021-04-16 19:00:45
@Peter Ajtai - 我看到了你的例子,但这实际上是我期望的行为......我希望数组对象的每个属性都被计算在内,无论该属性是否也代表数组索引。这样它也可以用于常规对象。我想这取决于你想要什么行为。
2021-04-24 19:00:45
if (store.hasOwnProperty(v))如果有人决定修改 Object 或 Array 的原型,我建议添加,因为人们似乎有点热衷于此;P
2021-04-25 19:00:45
oop,for我的意思循环for(var v=0; v < store.length; ++v){...}
2021-04-28 19:00:45
@no - 这还不够好,因为它store可以拥有自己的不是数组值的属性jsfiddle.net/vR5JK)。一个for循环会做的伎俩,虽然,因为数组中的值以外的任何东西都没有包含在store[0]store[store.length]
2021-05-04 19:00:45

解决方案着重于Array.prototype.forEach,如果最大计数多个项目之间共享获得多于一个关键的问题。

编辑:只有一个循环的提案。

var store = ['1', '2', '2', '3', '4', '5', '5'],
    distribution = {},
    max = 0,
    result = [];

store.forEach(function (a) {
    distribution[a] = (distribution[a] || 0) + 1;
    if (distribution[a] > max) {
        max = distribution[a];
        result = [a];
        return;
    }
    if (distribution[a] === max) {
        result.push(a);
    }
});
console.log('max: ' + max);
console.log('key/s with max count: ' + JSON.stringify(result));
console.log(distribution);

arr.sort();
    var max=0,result,freq = 0;
    for(var i=0; i < arr.length; i++){
        if(arr[i]===arr[i+1]){
            freq++;
        }
        else {
            freq=0;
        }
        if(freq>max){
            result = arr[i];
            max = freq;
        }
    }
    return result;
arr.sort() 是否总是正确排序数组中不同类型的组?
2021-04-15 19:00:45
我喜欢你的解决方案,因为它使用了大多数 C 系列语言通用的更基本的 JavaScript 指令。
2021-04-15 19:00:45
由于还有许多其他答案,因此添加关于为什么您的解决方案更可取的解释可能会有所帮助。您可以通过单击“编辑”按钮添加说明...
2021-04-18 19:00:45
谢谢你。我真的很喜欢你的解决方案!易读易懂。也适用于字符串。
2021-05-01 19:00:45
是的@ user2734550。arr.sort() 能够正确排序数组中不同类型的组。但如果你处理单个和多位数字,你可能需要这样排序: arr.sort(function(a,b){return a- b;})
2021-05-10 19:00:45

制作直方图,找到直方图中最大数字的关键。

var hist = [];
for (var i = 0; i < store.length; i++) {
  var n = store[i];
  if (hist[n] === undefined) hist[n] = 0;
  else hist[n]++;
}

var best_count = hist[store[0]];
var best = store[0];
for (var i = 0; i < store.length; i++) {
  if (hist[store[i]] > best_count) {
    best_count = hist[store[i]];
    best = store[i];
  }
}

alert(best + ' occurs the most at ' + best_count + ' occurrences');

这假设要么没有联系,要么您不在乎选择了哪个。

作为旁注,这称为分布模式。
2021-04-28 19:00:45
但是,如果数组已排序,则不需要。然后它可以是单程操作。
2021-05-07 19:00:45

如果数组已排序,这应该可以工作:

function popular(array) { 
   if (array.length == 0) return [null, 0];
   var n = max = 1, maxNum = array[0], pv, cv;

   for(var i = 0; i < array.length; i++, pv = array[i-1], cv = array[i]) {
      if (pv == cv) { 
        if (++n >= max) {
           max = n; maxNum = cv;
        }
      } else n = 1;
   }

   return [maxNum, max];
};

popular([1,2,2,3,4,9,9,9,9,1,1])
[9, 4]

popular([1,2,2,3,4,9,9,9,9,1,1,10,10,10,10,10])
[10, 5]
@greybeard,arr.sort() 是否可以很好地“分组”?我知道它对不同类型的排序不太好,但它是否正确分组?
2021-04-18 19:00:45
这些值不需要排序,只需分组即可。如果检查当前候选模式的频率,则比较较少if (pv != cv)
2021-05-07 19:00:45