返回数组中最大值的索引

2022-08-30 01:50:09

我有这个:

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

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


答案 1

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

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


答案 2

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

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"

哪里:

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

关于方法(来自David Flanagan的“JavaScript:The Definitive Guide”):reduce()

reduce() 采用两个参数。第一个是执行约简操作的函数。此约简函数的任务是以某种方式将两个值组合或减小为单个值,并返回该递减值。

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

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