我有这个:
var arr = [0, 21, 22, 7];
将最高值的索引返回到另一个变量的最佳方法是什么?
我有这个:
var arr = [0, 21, 22, 7];
将最高值的索引返回到另一个变量的最佳方法是什么?
这可能是最好的方法,因为它可靠并且适用于旧浏览器:
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 。我会坚持这个功能。
在一行中,可能会更快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()
是0
,reduce()
在我们的例子中我们不能省略第二个参数)x
- 数组中当前测试的元素i
- 当前测试的索引arr
- 我们的数组 ( [0, 21, 22, 7]
)关于该reduce()
方法(来自 David Flanagan 的“JavaScript: The Definitive Guide”):
reduce() 有两个参数。第一个是执行归约操作的函数。此归约函数的任务是以某种方式将两个值组合或归约为一个值,并返回该归约后的值。
与reduce() 一起使用的函数不同于与forEach() 和map() 一起使用的函数。熟悉的值、索引和数组值作为第二个、第三个和第四个参数传递。第一个参数是到目前为止减少的累积结果。在第一次调用该函数时,第一个参数是您作为第二个参数传递给 reduce() 的初始值。在后续调用中,它是前一次调用函数返回的值。
当您在没有初始值的情况下调用 reduce() 时,它使用数组的第一个元素作为初始值。这意味着对缩减函数的第一次调用将第一个和第二个数组元素作为它的第一个和第二个参数。
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;
}
如果你使用下划线,你可以使用这个漂亮的短单行:
_.indexOf(arr, _.max(arr))
它将首先找到数组中最大项的值,在本例中为 22。然后它将返回 22 在数组中的位置的索引,在本例中为 2。