javascript - Returner indeksen til den største verdien i en array
Jeg har dette:
var arr = [0, 21, 22, 7];
Hva er den beste måten å returnere indeksen til den høyeste verdien til en annen variabel?
Svar #1
Dette er sannsynligvis den beste måten, siden det er pålitelig og fungerer på gamle nettlesere:
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;
}
Det finnes også denne ene-lineren:
let i = arr.indexOf(Math.max(...arr));
Den utfører dobbelt så mange sammenligninger som nødvendig og vil kaste en RangeError på store arrayer, altså. Jeg ville holdt meg til funksjonen.
Svar #2
I én linje og sannsynligvis raskere enn 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"Hvor :
iMax- den beste indeksen så langt (indeksen til det største elementet så langt, på første iterasjoniMax=0fordi det andre argumentet tilreduce()er0, vi kan ikke utelate det andre argumentet tilreduce()i vårt tilfelle)x- det elementet som for øyeblikket testes fra arrayeni- den nåværende indeksen som testesarr- vårt array ([0, 21, 22, 7])
Om reduce()-metoden (fra «JavaScript: The Definitive Guide» av David Flanagan):
reduce() tar to argumenter. Det første er funksjonen som utfører reduksjonsoperasjonen. Oppgaven til denne reduksjonsfunksjonen er på en eller annen måte å kombinere eller redusere to verdier til en enkelt verdi, og å returnere den reduserte verdien.
Funksjoner som brukes med reduce() er forskjellige fra funksjonene som brukes med forEach() og map(). De kjente verdiene value, index og array blir sendt som henholdsvis andre, tredje og fjerde argument. Det første argumentet er det akkumulerte resultatet av reduksjonen så langt. På det første kall til funksjonen er dette første argumentet startverdien du sendte som det andre argumentet til reduce(). Ved påfølgende kall er det verdien som ble returnert av forrige anrop av funksjonen.
Når du kaller reduce() uten en initial verdi, bruker den det første elementet i arrayen som initialverdi. Dette betyr at det første kallet til reduksjonsfunksjonen vil ha det første og andre elementet i arrayen som sine første og andre argumenter.
