Aku punya ini:
var arr = [0, 21, 22, 7];
Apa cara terbaik untuk mengembalikan indeks dari nilai tertinggi ke variabel lain?
javascript
arrays
max
Stephen
sumber
sumber
Jawaban:
Ini mungkin cara terbaik, karena dapat diandalkan dan berfungsi di browser lama:
Ada juga satu kalimat ini:
Itu melakukan perbandingan dua kali lebih banyak yang diperlukan dan akan melemparkan
RangeError
pada array yang besar, meskipun. Saya akan tetap berpegang pada fungsinya.sumber
const max = arr.reduce((m, n) => Math.max(m, n))
, maka indeks max adalah[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
menghasilkan kesalahan:unexpected token
Dalam satu baris dan mungkin lebih cepat, maka
arr.indexOf(Math.max.apply(Math, arr))
:Dimana:
iMax
- indeks terbaik sejauh ini (indeks elemen maks sejauh ini, pada iterasi pertamaiMax = 0
karena argumen keduareduce()
adalah0
, kita tidak dapat menghilangkan argumen keduareduce()
dalam kasus kami)x
- elemen yang saat ini diuji dari arrayi
- indeks yang saat ini diujiarr
- array kami ([0, 21, 22, 7]
)Tentang
reduce()
metode (dari "JavaScript: The Definitive Guide" oleh David Flanagan):sumber
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, yang dapat digambarkan sebagai: iterate array dimulai dari indeks 0 (2 parameter), jika currentlyTestedValue lebih tinggi dari nilai elemen di bestIndexSoFar , kemudian kembali currentlyTestedIndex untuk iterasi berikutnya sebagai bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Berikut adalah solusi lain, Jika Anda menggunakan ES6 menggunakan operator spread:
sumber
Kecuali saya salah, saya akan mengatakan itu untuk menulis fungsi Anda sendiri.
sumber
Jika Anda menggunakan garis bawah, Anda dapat menggunakan kalimat singkat berikut:
Pertama-tama akan menemukan nilai item terbesar dalam array, dalam hal ini 22. Kemudian akan mengembalikan indeks di mana 22 berada dalam array, dalam hal ini 2.
sumber
Solusi lain menggunakan max
reduce
:Ini mengembalikan
[5e-324, -1]
jika array kosong. Jika Anda ingin hanya indeks, taruh[1]
setelah.Min via (Ubah ke
>
danMAX_VALUE
):sumber
EDIT: Bertahun-tahun yang lalu saya memberikan jawaban untuk ini yang kotor, terlalu spesifik, dan terlalu rumit. Jadi saya mengeditnya. Saya menyukai jawaban fungsional di atas untuk faktor rapi tetapi tidak mudah dibaca; tetapi jika saya lebih terbiasa dengan javascript maka saya mungkin akan menyukainya juga.
Kode palsu:
Lacak indeks yang berisi nilai terbesar. Asumsikan indeks 0 adalah yang terbesar pada awalnya. Bandingkan dengan indeks saat ini. Perbarui indeks dengan nilai terbesar jika perlu.
Kode:
sumber
lolos
array
darihaystack
danMath.max(...array)
keneedle
. Ini akan memberikan semua elemen max dari array, dan itu lebih dapat diperluas (misalnya, Anda juga perlu menemukan nilai min)sumber
Jika Anda membuat salinan array dan mengurutkannya, elemen pertama dari salinan akan menjadi yang terbesar. Daripada Anda dapat menemukan indeks dalam array asli.
Kompleksitas waktu adalah O (n) untuk salinan, O (n * log (n)) untuk penyortiran dan O (n) untuk indexOf.
Jika Anda perlu melakukannya lebih cepat, jawaban Ry adalah O (n).
sumber
sumber
Versi stabil dari fungsi ini terlihat seperti ini:
sumber
Sederhana
sumber