返回数组中最大值的索引

时间:2012-07-02 21:27:21

标签: javascript arrays max

我有这个:

var arr = [0, 21, 22, 7];

将最高值的索引返回到另一个变量的最佳方法是什么?

15 个答案:

答案 0 :(得分:130)

这可能是最好的方法,因为它可靠并适用于旧浏览器:

function indexOfMax(arr) {
    if (arr.length === 0) {
        return -1;
    }

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

还有这个单行:

let i = arr.indexOf(Math.max(...arr));

它执行的比较次数是必要的两倍,并且会在大型数组上抛出RangeError。我坚持这个功能。

答案 1 :(得分:71)

在一行中,可能比arr.indexOf(Math.max.apply(Math, arr))更快:

&#13;
&#13;
var a = [0, 21, 22, 7];
var indexOfMaxValue = a.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);

document.write("indexOfMaxValue = " + indexOfMaxValue); // prints "indexOfMaxValue = 2"
&#13;
&#13;
&#13;

其中:

  • iMax - 目前为止的最佳索引(到目前为止最大元素的索引,在第一次迭代iMax = 0,因为reduce()的第二个参数是0,在我们的例子中,我们不能省略reduce()的第二个参数
  • x - 数组中当前测试的元素
  • i - 当前测试的索引
  • arr - 我们的数组([0, 21, 22, 7]

关于reduce()方法(来自&#34; JavaScript:The Definitive Guide&#34; David Flanagan):

  

reduce()有两个参数。第一个是执行缩小操作的功能。此缩减功能的任务是以某种方式将两个值组合或减少为单个值,并返回该减少的值。

     

reduce()使用的函数与forEach()和map()使用的函数不同。熟悉的值,索引和数组值作为第二,第三和第四个参数传递。第一个论点是到目前为止减少的累积结果。在第一次调用函数时,第一个参数是您传递的初始值   reduce()的第二个参数。在后续调用中,它是上一次调用函数返回的值。

     

当您调用没有初始值的reduce()时,它使用数组的第一个元素作为初始值。这意味着第一次调用reduce函数将使用第一个和第二个数组元素   第一和第二个论点。

答案 2 :(得分:12)

这是另一种解决方案,如果您正在使用使用扩展运算符的ES6:

    var seekAnim = anime({

  targets: '#socialSeek .fa',
  margin: '0',
  // rotate: '2turn',
  translateX: 0,
  translateY: 100,
  scale: 2,
  delay: function(el, i, l) {
    return i * 100;
  },
  easing: 'easeOutElastic',
  elasticity: 200,
  autoplay: false

});

var seekProgressEl = document.querySelector('#seekAnim .progress');


seekProgressEl.addEventListener('input', function() {
  seekAnim.seek(seekAnim.duration * (seekProgressEl.value / 100));
});

答案 3 :(得分:6)

除非我弄错了,否则我会说是写自己的功能。

function findIndexOfGreatest(array) {
  var greatest;
  var indexOfGreatest;
  for (var i = 0; i < array.length; i++) {
    if (!greatest || array[i] > greatest) {
      greatest = array[i];
      indexOfGreatest = i;
    }
  }
  return indexOfGreatest;
}

答案 4 :(得分:5)

如果你正在使用下划线,你可以使用这个漂亮的短单线:

_.indexOf(arr, _.max(arr))

它将首先找到数组中最大项的值,在本例中为22.然后它将返回22在数组中的索引,在本例中为2.

答案 5 :(得分:4)

使用reduce的最大解决方案:

[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]

如果数组为空,则返回[5e-324, -1]。如果您只想要索引,请将[1]放在。

之后

最小值(更改为>MAX_VALUE):

[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]

答案 6 :(得分:3)

为完成@VFDan的工作,我对3种方法进行了基准测试:在10000个浮点数组上的接受方法(自定义循环),reduce和find(max(arr))。

在chromimum 85 linux上的结果(越高越好):

  • 自定义循环:100%
  • 减少:94.36%
  • indexOf(max):70%

在firefox 80 linux上的结果(越高越好):

  • 自定义循环:100%
  • 减少:96.39%
  • indexOf(max):31.16%

结论:

如果您需要代码快速运行,请不要使用indexOf(max)。 还可以,但如果需要最佳性能,请使用自定义循环。

您可以使用以下链接在其他浏览器上运行此基准测试: https://jsben.ch/wkd4c

答案 7 :(得分:1)

编辑:几年前,我给出了一个粗略,过于具体,过于复杂的答案。所以我正在编辑它。我赞成上面的功能性答案是因为它们的整洁因素,但不是它们的可读性;但如果我对javascript更熟悉,那么我也可能会喜欢它们。

伪代码:

跟踪包含最大值的索引。假设索引0最初是最大的。与当前指数进行比较。如有必要,更新具有最大值的索引。

代码:

var mountains = [3, 1, 5, 9, 4];

function largestIndex(array){
  var counter = 1;
  var max = 0;

  for(counter; counter < array.length; counter++){
    if(array[max] < array[counter]){
        max = counter;
    }
  }
  return max;
}

console.log("index with largest value is: " +largestIndex(mountains));
// index with largest value is: 3

答案 8 :(得分:1)

如果创建数组的副本并将其降序排列,则副本的第一个元素将是最大的。比您可以在原始数组中找到它的索引。

var sorted = [...arr].sort((a,b) => b - a)
arr.indexOf(sorted[0])

副本的时间复杂度为O(n),排序的时间复杂度为O(n * log(n)),而indexOf的时间复杂度为O(n)。

如果您需要更快地执行此操作,Ry的答案是O(n)。

答案 9 :(得分:0)

&#13;
&#13;
 var arr=[0,6,7,7,7];
 var largest=[0];
 //find the largest num;
 for(var i=0;i<arr.length;i++){
   var comp=(arr[i]-largest[0])>0;
      if(comp){
	  largest =[];
	  largest.push(arr[i]);
	  }
 }
 alert(largest )//7
 
 //find the index of 'arr'
 var arrIndex=[];
 for(var i=0;i<arr.length;i++){
    var comp=arr[i]-largest[0]==0;
	if(comp){
	arrIndex.push(i);
	}
 }
 alert(arrIndex);//[2,3,4]
&#13;
&#13;
&#13;

答案 10 :(得分:0)

function findIndicesOf(haystack, needle)
{
    var indices = [];

    var j = 0;
    for (var i = 0; i < haystack.length; ++i) {
        if (haystack[i] == needle)
            indices[j++] = i;
    }
    return indices;
}

array传递到haystack,将Math.max(...array)传递到needle。这将给出数组的 all 个max元素,并且更具扩展性(例如,您还需要查找min值)

答案 11 :(得分:-1)

此函数的稳定版本如下所示:

// not defined for empty array
function max_index(elements) {
    var i = 1;
    var mi = 0;
    while (i < elements.length) {
        if (!(elements[i] < elements[mi]))
            mi = i;
        i += 1;
    }
    return mi;
}

答案 12 :(得分:-1)

ES6的Function.prototype.apply()似乎是解决此问题的最有效方法,将null作为第一个值。

const num = [0, 21, 22, 7];

let greatestValue = Math.max.apply(null, num);


console.log(num.indexOf(greatest Value)); //2

答案 13 :(得分:-2)

最简单的解决方案是:

Math.max(...array);

答案 14 :(得分:-4)

简单

maxarr: function(){
let maxval = 0;
let maxindex = null;
for (i = 0; i < arr.length; i++){
if (arr[i] > maxval) {
maxval = arr[i];
maxindex = i;
}
}
}