Saya mencari cara yang sangat cepat, bersih, dan efisien untuk mendapatkan nilai "y" maksimum dalam slice JSON berikut:
[
{
"x": "8/11/2009",
"y": 0.026572007
},
{
"x": "8/12/2009",
"y": 0.025057454
},
{
"x": "8/13/2009",
"y": 0.024530916
},
{
"x": "8/14/2009",
"y": 0.031004457
}
]
Apakah for-loop satu-satunya cara untuk melakukannya? Saya tertarik entah bagaimana menggunakan Math.max
.
javascript
json
Rio
sumber
sumber
Jawaban:
Untuk menemukan nilai maksimum
y
objek diarray
:sumber
this
dan serangkaian argumen yang ditentukan sebagai array. Kuncinya adalah bahwa berlaku mengubah array menjadi serangkaian argumen fungsi aktual. Jadi dalam hal ini akhirnya panggilanMath.max(0.0265, 0.0250, 0.024, 0.031)
denganthis
fungsi yang dijalankanMath
. Saya tidak bisa melihat mengapa itu harusMath
terus terang, saya tidak berpikir fungsi ini memerlukan validthis
. Oh dan inilah penjelasan yang tepat: stackoverflow.com/questions/21255138/…Temukan objek yang propertinya "Y" memiliki nilai terbesar dalam array objek
Salah satu cara adalah dengan menggunakan pengurangan Array ..
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce http://caniuse.com/#search=reduce (IE9 ke atas)
Jika Anda tidak perlu mendukung IE (hanya Edge), atau dapat menggunakan pra-kompiler seperti Babel Anda bisa menggunakan sintaks yang lebih singkat.
sumber
const max = data.reduce((prev, current) => (prev.y > current.y) ? prev : current, 1)
null
lebih dari 1.ES6 bersih dan sederhana (Babel)
Parameter kedua harus memastikan nilai default jika
arrayToSearchIn
kosong.sumber
-Infinity
(a truthy nilai) untuk array kosong-Infinity
untuk array kosong, Anda bisa memberikan nilai awalMath.max(...state.allProjects.map(o => o.id), 1);
0
menjadiarrayToSearchIn[0].y
. Perbandingan kompleksitas waktu: stackoverflow.com/a/53654364/860099Perbandingan ONELINER pohon yang menangani case angka minus (input in
a
array):contoh yang dapat diedit di sini . Gagasan dari: maxA , maxB dan maxC (efek samping dari maxB adalah array
a
diubah karenasort
ada di tempat).Tampilkan cuplikan kode
Untuk array yang lebih besar
Math.max...
pengecualian lemparan akan terlampaui: Ukuran tumpukan panggilan maksimum terlampaui (Chrome 76.0.3809, Safari 12.1.2, tanggal 2019-09-13)Tampilkan cuplikan kode
sumber
y
dengan meninggalkan.y
di akhir.Pertama, Anda harus mengurai string JSON, sehingga Anda dapat dengan mudah mengakses anggota itu:
Gunakan
map
metode untuk mengekstrak nilai:Kemudian Anda bisa menggunakan array dalam
max
metode:Atau sebagai one-liner:
sumber
jQuery
json
- dia tidak menggunakan perpustakaan javascript eksternal dalam jawabannya :)Saya ingin menjelaskan jawaban singkat yang diterima selangkah demi selangkah:
Informasi lebih lanjut:
Math.max.apply()
Array.prototype.map()
Array.from()
Function.prototype.apply()
Array.prototype.filter()
Array.prototype.find()
sumber
sumber
jika Anda (atau, seseorang di sini) bebas menggunakan
lodash
perpustakaan utilitas, ia memiliki fungsi maxBy yang akan sangat berguna dalam kasus Anda.maka Anda dapat menggunakan seperti itu:
sumber
Atau semacam sederhana! Menjaga agar tetap nyata :)
sumber
a.y<a.y
keb.y-a.y
. Perbandingan kompleksitas waktu di sini: stackoverflow.com/a/53654364/860099Setiap array dan dapatkan nilai maksimal dengan Matematika.
sumber
Inilah solusi terpendek (One Liner) ES6 :
sumber
sumber
Solusi ES6
Math.max(...array.map(function(o){return o.y;}))
Untuk detail lebih lanjut, lihat https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
sumber
sumber