在数组中查找多个最大值的索引

时间:2016-06-12 23:31:59

标签: javascript arrays

我有一个示例数组:

var arr = [10, 67, 100, 100];

我想找到数组中最大值的索引。

此函数只找到一个索引:

function max(arr) {
      var max = arr[0];
      var maxIndex = 0;
      for (var i = 1; i < arr.length; i++) {
          if (arr[i] > max) {
              maxIndex = i;
              max = arr[i];
          }
      }
      return maxIndex;
 }

如何修改它以返回最大索引数组?在上面的示例数组中,它应该返回

[2, 3]

6 个答案:

答案 0 :(得分:2)

您需要跟踪所有索引,而不是仅跟踪一个索引。试一试:

function max(arr) {
    var max = -Infinity;
    var maxIndices = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === max) {
          maxIndices.push(i);
        } else if (arr[i] > max) {
            maxIndices = [i];
            max = arr[i];
        }
    }
    return maxIndices;
 }

答案 1 :(得分:1)

function max(arr) {
    var largest = Math.max.apply(Math, arr);

    var indexes = [], i = -1;
    while ((i = arr.indexOf(largest, i+1)) != -1){
        indexes.push(i);
    }
    return indexes;
}

var arr = [10, 67, 100, 100];
console.log(max(arr));

答案 2 :(得分:1)

我会喜欢这个;

&#13;
&#13;
var arr = [10, 67, 100, 100],
      m = Math.max(...arr),
  maxes = arr.reduce((p,c,i,a) => c ==  m ? p.concat(i) : p,[]);
console.log(maxes);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

JS Reduce可以帮助完成这项任务。

&#13;
&#13;
let list_swap l u v = List.rev (List.rev_map swap (u v) l);;
&#13;
&#13;
&#13;

答案 4 :(得分:0)

基于this runtime comparison,我建议通过优化for-loop搜索最大索引:

function max(arr) {
  var max = -Infinity, indices = [];
  for (var i = 0; i < arr.length; ++i) {
    if (arr[i] < max) continue;
    if (arr[i] > max) {
      indices = [];
      max = arr[i];
    }
    indices.push(i);
  }
  return indices;
}

console.log(max([10, 67, 100, 100])); // [2, 3]

首先与arr[i] < max进行比较是有用的,因为它在大多数时候评估为真,因此我们可以跳过下一次迭代,只有1次数组访问+平均比较。

不同算法的运行时比较:

根据https://jsfiddle.net/jv1z29jm/2/ - 请随时更新。

  • Chrome(48):

    max_indexOf x 15,381 ops/sec ±2.94% (87 runs sampled)
    max_reduce x 2,909 ops/sec ±2.63% (86 runs sampled)
    max_forloop x 119,964 ops/sec ±1.80% (87 runs sampled)
    max_forloopOptimized x 165,581 ops/sec ±1.50% (87 runs sampled)
    Fastest is max_forloopOptimized
    
  • Firefox(46):

    max_indexOf x 56,456 ops/sec ±0.74% (67 runs sampled)
    max_reduce x 74,959 ops/sec ±0.86% (65 runs sampled)
    max_forloop x 73,223 ops/sec ±24.75% (58 runs sampled)
    max_forloopOptimized x 84,567 ops/sec ±9.99% (61 runs sampled)
    Fastest is max_forloopOptimized
    

答案 5 :(得分:0)

这是解决方案,当您在第一个位置找到最大值,然后索引所有最大值时。

function multipleMax(arr){
	
	var maxvalue = Math.max(...arr);
	var maxIndexes = [];
	
	for(i = 0; i < arr.length; i++){
			if(arr[i] == maxvalue){
				maxIndexes.push(i);};
        };
	return maxIndexes;
};

var arr = [10, 67, 100, 100];
console.log(multipleMax(arr));