我有这个:
var arr = [0, 21, 22, 7];
将最大值索引返回到另一个变量的最佳方法是什么?
我有这个:
var arr = [0, 21, 22, 7];
将最大值索引返回到另一个变量的最佳方法是什么?
Answers:
这可能是最好的方法,因为它可靠并且可以在旧的浏览器上运行:
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
在大型数组上抛出。我会坚持使用该功能。
const max = arr.reduce((m, n) => Math.max(m, n))
,则最大值的索引为[...arr.keys()].filter(i => arr[i] === max)
。
[...arr.keys()]
输出错误:unexpected token
只需一行,然后可能会更快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()
在本例中我们不能省略to的第二个参数)x
-数组中当前测试的元素i
-当前测试的索引arr
-我们的数组([0, 21, 22, 7]
)关于该reduce()
方法(摘自David Flanagan的“ JavaScript:权威指南”):
reduce()有两个参数。第一个是执行归约运算的功能。此归约函数的任务是以某种方式将两个值组合或归约为一个值,并返回该归约值。
与reduce()一起使用的函数不同于与forEach()和map()一起使用的函数。熟悉的值,索引和数组值作为第二,第三和第四自变量传递。第一个论点是迄今为止减少量的累计结果。在第一次调用该函数时,第一个参数是您作为reduce()的第二个参数传递的初始值。在后续调用中,它是该函数先前调用返回的值。
当您调用没有初始值的reduce()时,它将使用数组的第一个元素作为初始值。这意味着对简化函数的第一次调用将把第一和第二数组元素作为其第一和第二自变量。
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
,其可以被描述为:迭代阵列从索引0(第2参数)开始,如果currentlyTestedValue比在所述元素的值更高bestIndexSoFar,则返回currentlyTestedIndex到下一次迭代的bestIndexSoFar。
this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
。
编辑:几年前,我对此给出了一个答案,该答案是总的,过于具体和过于复杂的。所以我正在编辑。我赞成上面的功能性回答,因为它们整洁,但不可读。但是,如果我对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
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]