返回数组中最大值的索引

IT技术 javascript arrays max
2021-01-28 23:50:27

我有这个:

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

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

6个回答

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

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在大型数组上抛出 a 我会坚持这个功能。

@ed1nh0:简单的方法是多次通过。用 求最大值const max = arr.reduce((m, n) => Math.max(m, n)),则最大值的索引为[...arr.keys()].filter(i => arr[i] === max)
2021-03-18 23:50:27
@ed1nh0:哪个版本的 Chrome?还是错误来自 webpack 构建?
2021-03-29 23:50:27
铬合金。我正在使用 VueJS,我猜问题出在 webpack 配置上。
2021-03-31 23:50:27
[...arr.keys()] 输出错误: unexpected token
2021-04-05 23:50:27
好的,此函数返回第一个遇到的最大值的索引假设我有多个具有相同最高值的索引,我如何获得所有这些索引?
2021-04-08 23:50:27

在一行中,可能会更快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- 迄今为止最好的索引(迄今为止最大元素的索引,在第一次迭代时,iMax = 0因为 to 的第二个参数reduce()0reduce()在我们的例子中我们不能省略第二个参数
  • x - 数组中当前测试的元素
  • i - 当前测试的索引
  • arr- 我们的数组 ( [0, 21, 22, 7])

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

reduce() 有两个参数。第一个是执行归约操作的函数。此归约函数的任务是以某种方式将两个值组合或归约为一个值,并返回该归约后的值。

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

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

@DanielK,带有“完整”参数名称的答案不适合在一个 stackoverflow 行中。会出现一个水平滚动条,在水平滚动时阅读代码片段不是很方便。无论如何感谢您的建议。我以另一种方式编辑了答案。
2021-03-13 23:50:27
@traxium 虽然你的解释很好,但如果我们使用更多描述性变量,那么对于那些不太了解函数式编程的人来说,这个例子可能会更清楚。说:arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);,其可以被描述为:迭代阵列从索引0(第2参数)开始,如果currentlyTestedValue比在所述元素的值更高bestIndexSoFar,则返回currentlyTestedIndex到下一次迭代的bestIndexSoFar
2021-03-26 23:50:27
根据jsben.ch/ujXlk,另一种方法更快。
2021-03-26 23:50:27
@traxium 很棒的答案。我也同意@niieani这是一个现实世界的例子,我实现:this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
2021-03-28 23:50:27
@traxium +1 用于 FP 解决方案。虽然对于刚开始接触 JS 的人来说是病态的复杂,但您的解决方案也恰好是解决 OP 问题的最佳解决方案之一。
2021-04-08 23:50:27

max 的另一种解决方案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]

除非我弄错了,否则我会说它是编写自己的函数。

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;
}
不能很好地处理零作为最大值: findIndexOfGreatest( [-5, 0, -10, -1])返回 3 ...
2021-03-25 23:50:27

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

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

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