2016-06-12 43 views
2

我有一个例子数组:查找多个最大值的指标在阵列

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]

回答

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

'arr'可能是空的。我会初始化'max = -Infinity; maxIndices = [];我= 0“。 – Oriol

+0

感谢@Oriol,编辑了您的建议。 – smarx

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

0

JS的Reduce可以完成这个任务有所帮助。

// Finds maximum value across entire array 
 
var maxArrSingle = function(arr) { 
 
    return arr.reduce(
 
    function(acc,val){ 
 
     return Math.max(acc,val); 
 
    }, 
 
    -Infinity); 
 
} 
 

 
// Find indices where array is at max 
 
var maxArrIndexes = function(arr) { 
 
    var max = maxArrSingle(arr); 
 
    return arr.reduce(function(acc,val,idx) { 
 
    if (val >= max) acc.push(idx); 
 
    return acc; 
 
    },[]); 
 
} 
 

 
// demos 
 
var arr = [10, 67, 100, 100]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [-10, -67, -100, -100, -4000, -9, -90, -90 ]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = []; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [0]; 
 
console.log(maxArrIndexes(arr)); 
 

 
var arr = [0,0]; 
 
console.log(maxArrIndexes(arr));

+0

为输入'[0]'或'[0,0]'返回'[]''替换'arr [0] || Number.MIN_VALUE'与例如'-Infinity'来使它工作。 –

+0

@le_m很好。我更新了代码 – user01

0

基于this runtime comparison,我建议寻找最大指数通过对循环优化:

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首先是因为有用它评估为t rue大部分时间,从而使我们能够跳到下一次迭代,只有1个数组访问权限+平均比较。不同的两种算法的

运行比较:

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

  • 铬(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 
    
  • 火狐(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 
    
1

我会做这样;

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