Diberikan array [1, 2, 3, 4]
, bagaimana saya bisa menemukan jumlah elemen-elemennya? (Dalam hal ini, jumlahnya akan menjadi 10
.)
Saya pikir $.each
mungkin bermanfaat, tetapi saya tidak yakin bagaimana cara mengimplementasikannya.
javascript
jquery
arrays
akano1
sumber
sumber
a[0] + a[1] + ...
, yang dapat berubah menjadi penggabungan string jika array memiliki elemen non-angka. Misalnya['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Jawaban:
Disarankan (kurangi dengan nilai default)
Array.prototype.reduce dapat digunakan untuk beralih melalui array, menambahkan nilai elemen saat ini ke jumlah nilai elemen sebelumnya.
Tanpa nilai default
Anda mendapatkan TypeError
Sebelum fungsi panah ES6
Input non-angka
Jika bukan angka adalah input yang mungkin, Anda mungkin ingin mengatasinya?
Penggunaan eval berbahaya yang tidak direkomendasikan
Kita dapat menggunakan eval untuk menjalankan representasi string dari kode JavaScript. Menggunakan fungsi Array.prototype.join untuk mengubah array menjadi string, kami mengubah [1,2,3] menjadi "1 + 2 + 3", yang dievaluasi menjadi 6.
Tentu saja menampilkan peringatan bukanlah hal terburuk yang bisa terjadi. Satu-satunya alasan saya memasukkan ini adalah sebagai jawaban pertanyaan Ortund karena saya pikir itu tidak diklarifikasi.
sumber
reduce()
ini masih 25-30% lebih lambat daripadafor()
loop yang diindeks sederhana setelah bertahun-tahun? jsperf.com/reduce-vs-loop/4Di Lisp , ini akan menjadi pekerjaan yang tepat
reduce
. Anda akan melihat kode seperti ini:Untungnya, dalam JavaScript, kami juga punya
reduce
! Sayangnya,+
operator, bukan fungsi. Tapi kita bisa membuatnya cantik! Di sini, lihat:Bukankah itu cantik? :-)
Bahkan lebih baik! Jika Anda menggunakan ECMAScript 2015 (alias ECMAScript 6 ), bisa jadi ini cantik:
sumber
[1, 2, 3].reduce((a,b)=>a+b)
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); }
Array.prototype.avg = function() { return this.reduce((a,b) => a+b, 0)/this.length; }
Kenapa tidak mengurangi? Biasanya sedikit kontra intuitif, tetapi menggunakannya untuk menemukan jumlah cukup mudah:
sumber
reduce()
?Array.prototype.reduce()
mengurangi array ke nilai pengembalian tunggal.sumber
(var i=0; i<arr.length; i++)
lebih cepat. Dan bahkan kemudian, menggunakanvar sum=0; var i=arr.length; while(i--) sum += arr[i]
lebih cepat lagi.for... in
loop pada array berfungsi dalam kasus ini _ kebetulan_ dan karena array memperpanjang objek. Solusi Riking lebih baikfor...in
loop dalam JavaScript mengambil indeks, yang merupakan batu sandungan yang umum untuk coders yang mengharapkan untuk mendapatkan nilai. (Cobafor(var i in [1,2,3]) { console.log(i); }
di konsol.)sumber
reduce
bawah ini; jangan mendeklarasikan vars yang bisa berubah ketika Anda tidak memilikinya.Jika Anda menggunakan Lodash, Anda bisa menggunakan fungsi penjumlahan
sumber
Ini dimungkinkan dengan mengulang semua item, dan menambahkannya pada setiap iterasi ke
sum
-variable.JavaScript tidak tahu pencekalan blok, jadi
sum
dapat diakses:Sama seperti di atas, namun dijelaskan dan disiapkan sebagai fungsi sederhana:
sumber
sum
luar loop jauh lebih mudah dibaca.const
danlet
. Jadi, Anda dapat mendeklarasikan disum
luarfor
loop sebagailet sum = 0;
. Anda juga dapat men-cache panjang array sebelum loop sebagaiconst length = array.length;
Referensi: Array.prototype.reduce ()
sumber
arr
ada[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Ini akan memakan waktu rata-rata 1,57 ms / run (diukur lebih dari 1000 berjalan pada array 100 angka normal acak), dibandingkan dengan 3,604 ms / run dengan
eval()
metode di atas dan 2,151 ms / run dengan standar untuk (i, panjang, ++ ) loop.Catatan metodologi: tes ini dijalankan pada server Google Apps Script, jadi mesin javascript mereka hampir sama dengan Chrome.
EDIT:
--i
bukannyai--
menyimpan 0,12 ms setiap kali berjalan (i-- adalah 1,7)EDIT: Suci sumpah serapah, apalagi posting ini. Gunakan metode pengurangan () yang disebutkan di atas, hanya 1 ms / run.
sumber
while (--i) do_something
mungkin bekerja untuk hal-hal lain juga.var sum = arr[0]
Anda juga dapat menggunakan Kurangi.
yang menghasilkan output sebagai 21.
Referensi: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
sumber
Adakah yang mencari oneliner fungsional seperti saya? Ambil ini:
sumber
arr.reduce(function(a, b) { return a + b;}, 0);
OK, bayangkan Anda memiliki array ini di bawah ini:
Mari kita mulai mencari berbagai cara untuk melakukannya karena saya tidak dapat menemukan jawaban yang komprehensif di sini:
1) Menggunakan pengurangan bawaan ()
2) Menggunakan untuk loop
3) Menggunakan while
4) Menggunakan array forEach
dan menyebutnya seperti ini:
Tidak disarankan untuk membuat prototipe seperti ini ke Array ...
sumber
Pendekatan lucu:
sumber
reduce
jelas lebih disukai untuk sebagian besar, jika tidak semua, kasus.[1,"2;YourProgram.ripToShreds();3",4]
NaN
ketika mencobaeval(['alert("removing your computer")',2,3].join("+"))
jawaban yang salah 0/10Solusi JavaScript standar:
Ini bekerja untuk saya (hasilnya harus 5). Saya harap tidak ada kerugian tersembunyi dalam solusi semacam ini.
sumber
Dengan begitu Anda bisa meletakkan segala macam hal eksotis dalam array.
Saya hanya setengah bercanda.
sumber
eval(['alert("removing your computer")',2,3].join("+"))
Saya seorang pemula dengan JavaScript dan coding pada umumnya, tetapi saya menemukan bahwa cara sederhana dan mudah untuk menjumlahkan angka-angka dalam array adalah seperti ini:
Pada dasarnya, saya ingin berkontribusi ini karena saya tidak melihat banyak solusi yang tidak menggunakan fungsi bawaan, dan metode ini mudah ditulis dan dipahami.
sumber
Sepotong kode JavaScript singkat akan melakukan pekerjaan ini:
sumber
Beberapa orang menyarankan menambahkan
.sum()
metode keArray.prototype
. Ini umumnya dianggap praktik buruk sehingga saya tidak menyarankan Anda melakukannya.Jika Anda masih bersikeras melakukannya maka ini adalah cara yang ringkas untuk menuliskannya:
kemudian:
[1,2].sum(); // 3
Perhatikan bahwa fungsi yang ditambahkan ke prototipe menggunakan campuran fungsi ES5 dan ES6 dan sintaks panah. The
function
dinyatakan untuk memungkinkan metode untuk mendapatkanthis
konteks dariArray
yang Anda beroperasi pada. Saya menggunakan=>
untuk singkatnya dalamreduce
panggilan.sumber
Gunakan satu
for
lingkaran:Atau bahkan satu
forEach
loop:Untuk kesederhanaan, gunakan
reduce
:sumber
Tidak perlu
initial value
! Karena jika tidakinitial value
dilewatkan, makacallback function
tidak dipanggil pada elemen pertama dari daftar, dan elemen pertama malah dilewatkan sebagaiinitial value
. Sangat kaya fitur :)sumber
Berikut adalah solusi one-liner yang elegan yang menggunakan algoritma stack , meskipun orang mungkin perlu waktu untuk memahami keindahan implementasi ini.
Pada dasarnya, fungsi menerima array dan memeriksa apakah array berisi tepat satu item. Jika salah, ia mengeluarkan item terakhir dari tumpukan dan mengembalikan array yang diperbarui.
Keindahan potongan ini adalah bahwa fungsinya termasuk
arr[0]
memeriksa untuk mencegah perulangan tak terbatas. Setelah mencapai item terakhir, ia mengembalikan seluruh jumlah.sumber
Anda dapat menggabungkan metode reduce () dengan ekspresi lambda:
sumber
Menggunakan
reduce
sumber
saya melihat semua jawaban akan solusi 'mengurangi'
sumber
Ketepatan
Sortir larik dan mulai jumlah penjumlahan dari bilangan terkecil (cuplikan menunjukkan perbedaan dengan nonsort)
Tampilkan cuplikan kode
Untuk penggunaan array angka multidimensi
arr.flat(Infinity)
Tampilkan cuplikan kode
sumber
Trik-trik keren di sini, saya punya pilihan nit dengan banyak jawaban tradisional yang aman dan tidak menyimpan panjang array.
Tanpa caching panjang array, kompiler JS harus melalui array dengan setiap iterasi dari loop untuk menghitung panjang, itu tidak perlu overhead dalam banyak kasus. V8 dan banyak peramban modern mengoptimalkan ini untuk kami, jadi ini kurang menjadi perhatian dibanding sebelumnya, tetapi ada perangkat yang lebih tua yang mendapat manfaat dari caching sederhana ini.
Jika panjangnya dapat berubah, caching yang dapat menyebabkan beberapa efek samping yang tidak terduga jika Anda tidak tahu mengapa Anda caching panjang, tetapi untuk fungsi yang dapat digunakan kembali yang hanya bertujuan untuk mengambil array dan menambahkan nilai bersama itu adalah sangat cocok.
Inilah tautan CodePen untuk fungsi arraySum ini. http://codepen.io/brandonbrule/pen/ZGEJyV
Mungkin saja ini adalah pola pikir yang sudah ketinggalan zaman yang melekat pada saya, tetapi saya tidak melihat kerugian untuk menggunakannya dalam konteks ini.
sumber
Itu adalah jawaban yang benar-benar hebat, tetapi untuk jaga-jaga jika angkanya dalam urutan seperti pada pertanyaan (1,2,3,4) Anda dapat dengan mudah melakukannya dengan menerapkan rumus (n * (n + 1)) / 2 di mana n adalah angka terakhir
sumber
sumber
Ini jauh lebih mudah
sumber
Contoh metode sederhana:
sumber