Saya memiliki objek JavaScript Array sederhana yang berisi beberapa angka.
[267, 306, 108]
Apakah ada fungsi yang akan menemukan angka terbesar dalam array ini?
javascript
algorithm
arrays
max
Dotty
sumber
sumber
Math.max(...[267, 306, 108]);
Jawaban:
Resig untuk menyelamatkan:
Peringatan : karena jumlah maksimum argumen serendah 65535 pada beberapa VM , gunakan for for loop jika Anda tidak yakin arraynya sekecil itu.
sumber
apply
panggilan dapat mencuci dengan sangat mudah.RangeError: Maximum call stack size exceeded.
Anda dapat menggunakan fungsi terapkan, untuk memanggil Math.max :
Bagaimana itu bekerja?
Fungsi terapkan digunakan untuk memanggil fungsi lain, dengan konteks dan argumen yang diberikan, disediakan sebagai array. Fungsi min dan maks dapat mengambil sejumlah argumen input yang berubah-ubah: Math.max (val1, val2, ..., valN)
Jadi, jika kita memanggil:
Fungsi yang berlaku akan menjalankan:
Perhatikan bahwa parameter pertama, konteksnya, tidak penting untuk fungsi-fungsi ini karena mereka statis, mereka akan bekerja terlepas dari apa yang dilewatkan sebagai konteks.
sumber
Sintaks termudah, dengan operator spread baru :
Sumber: Mozilla MDN
sumber
Saya bukan ahli JS, tetapi saya ingin melihat bagaimana metode ini menumpuk, jadi ini adalah praktik yang baik bagi saya. Saya tidak tahu apakah ini secara teknis cara yang tepat untuk menguji kinerja ini, tapi saya hanya menjalankannya satu per satu, seperti yang Anda lihat dalam kode saya.
Menyortir dan mendapatkan nilai 0 sejauh ini merupakan metode terburuk (dan itu mengubah urutan array Anda, yang mungkin tidak diinginkan). Bagi yang lain, perbedaannya dapat diabaikan kecuali Anda berbicara jutaan indeks.
Hasil rata-rata dari lima proses dengan array angka indeks 100.000 acak:
sumber
jsperf tests
untuk di atasSaya telah menemukan bahwa untuk array yang lebih besar (~ elemen 100k), sebenarnya membayar untuk hanya mengulangi array dengan
for
loop sederhana , berkinerja ~ 30% lebih baik daripadaMath.max.apply()
:Hasil benchmark
sumber
Anda bisa mengurutkan array dalam urutan menurun dan mendapatkan item pertama:
sumber
sort(function(a,b){return b-a;})
[...].sort().pop()
Bagaimana dengan ini:
sumber
bagaimana dengan menggunakan Array.reduce ?
sumber
-Infinity
.Hampir semua jawaban menggunakan
Math.max.apply()
yang bagus dan keren tetapi memiliki keterbatasan.Argumen fungsi ditempatkan pada tumpukan yang memiliki sisi negatif - batas. Jadi jika array Anda lebih besar dari batas itu akan gagal
RangeError: Maximum call stack size exceeded.
Untuk menemukan ukuran tumpukan panggilan saya menggunakan kode ini:
Itu terbukti menjadi yang terbesar di FireFox di mesin saya - 591519 . Ini berarti bahwa jika array Anda berisi lebih dari 5.915.19 item,
Math.max.apply()
akan menghasilkan RangeError .Solusi terbaik untuk masalah ini adalah cara berulang (kredit: https://developer.mozilla.org/ ):
Saya telah menulis tentang pertanyaan ini di blog saya di sini .
sumber
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
sumber
Menemukan nilai maks dan minimum dengan cara mudah dan manual. Kode ini jauh lebih cepat daripada
Math.max.apply
; Saya telah mencoba hingga 1000 ribu angka dalam array.sumber
findmax()
memberikan hasil yang salah jika hanya ada angka negatif dalam array;findmin()
memberikan hasil yang salah untuk array kosong.Untuk menemukan angka terbesar dalam array yang hanya perlu Anda gunakan
Math.max(...arrayName);
, ini berfungsi seperti ini:Untuk mempelajari lebih lanjut tentang
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxsumber
Ya tentu saja ada:
Math.max.apply(null,[23,45,67,-45])
dan hasilnya kembali67
;sumber
Sederhana satu liner
sumber
Jangan lupa bahwa membungkus dapat dilakukan dengan
Function.prototype.bind
, memberikan Anda "semua-asli" fungsi .sumber
Anda juga dapat memperluas
Array
untuk memiliki fungsi ini dan menjadikannya bagian dari setiap array.sumber
Anda juga dapat menggunakan forEach :
sumber
Menggunakan -
Array.prototype.reduce()
keren![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
di mana acc = akumulator dan val = nilai saat ini ;
sumber
Anda dapat mencoba ini,
sumber
Saya baru saja mulai dengan JS tetapi saya pikir metode ini akan bagus:
sumber
array
hanya berisi angka negatif.Temukan angka terbesar dalam array multidimensi
sumber
var tmax = Math.max.apply(Math, max)
, atau lebih baik lagi, menggunakan penutupan fungsi loop misalnya di stackoverflow.com/a/54980012/7438857 . Dengan modifikasi ini, lebih baik dijawab pertanyaan terpisah, bagaimana Anda "menemukan angka terbesar dalam array multidimensi", atau di stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Jalankan ini:
Dan sekarang coba
[3,10,2].max()
kembali10
sumber
Temukan nilai Max dan Min menggunakan Bubble Sort
sumber
Coba ini
sumber
Sesuai komentar @ Quasimondo , yang tampaknya sebagian besar telah dilewatkan, di bawah ini tampaknya memiliki kinerja terbaik seperti yang ditunjukkan di sini: https://jsperf.com/finding-maximum-element-in-an-array . Perhatikan bahwa sementara untuk array dalam pertanyaan, kinerja mungkin tidak memiliki efek yang signifikan, untuk kinerja array besar menjadi lebih penting, dan sekali lagi seperti yang dicatat menggunakan
Math.max()
bahkan tidak berfungsi jika panjang array lebih dari 65.535. Lihat juga jawaban ini .sumber
Pendekatan rekursif tentang cara melakukannya menggunakan operator ternary
sumber
Satu
for/of
solusi loop:sumber