Saya punya sesuatu seperti ini:
$scope.traveler = [
{ description: 'Senior', Amount: 50},
{ description: 'Senior', Amount: 50},
{ description: 'Adult', Amount: 75},
{ description: 'Child', Amount: 35},
{ description: 'Infant', Amount: 25 },
];
Sekarang untuk memiliki jumlah total array ini, saya melakukan sesuatu seperti ini:
$scope.totalAmount = function(){
var total = 0;
for (var i = 0; i < $scope.traveler.length; i++) {
total = total + $scope.traveler[i].Amount;
}
return total;
}
Sangat mudah ketika hanya satu array, tetapi saya memiliki array lain dengan nama properti berbeda yang ingin saya jumlahkan.
Saya akan lebih bahagia jika saya bisa melakukan sesuatu seperti ini:
$scope.traveler.Sum({ Amount });
Tapi saya tidak tahu bagaimana harus melalui ini sehingga saya bisa menggunakannya kembali di masa depan seperti ini:
$scope.someArray.Sum({ someProperty });
Menjawab
Saya memutuskan untuk menggunakan saran @ gruff-bunny, jadi saya menghindari prototyping objek asli (Array)
Saya baru saja melakukan sedikit modifikasi untuk jawabannya memvalidasi array dan nilai untuk menjumlahkan tidak nol, ini adalah implementasi terakhir saya:
$scope.sum = function (items, prop) {
if (items == null) {
return 0;
}
return items.reduce(function (a, b) {
return b[prop] == null ? a : a + b[prop];
}, 0);
};
javascript
arrays
prototype-programming
nramirez
sumber
sumber
Jawaban:
Jawaban yang Diperbarui
Karena semua kerugian dari menambahkan fungsi ke prototipe Array, saya memperbarui jawaban ini untuk memberikan alternatif yang membuat sintaksis mirip dengan sintaks yang awalnya diminta dalam pertanyaan.
Jawaban Asli
Karena ini adalah array, Anda dapat menambahkan fungsi ke prototipe Array.
The Fiddle: http://jsfiddle.net/9BAmj/
sumber
Array.prototype
karena mungkin merusak kode Anda di masa depan. Mengapa memperluas objek asli adalah praktik yang buruk? .Saya tahu bahwa pertanyaan ini memiliki jawaban yang diterima tetapi saya pikir saya akan ikut serta dengan alternatif yang menggunakan array.reduce , melihat bahwa menjumlahkan array adalah contoh kanonik untuk mengurangi:
Fiddle
sumber
$scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');
di awal fungsi pengontrol?sumber
return Number(item.Amount);
untuk memeriksa nomor sajaprev
dalam fungsi pengurangan. Bagi saya, itu menyiratkan bahwa Anda mendapatkan nilai sebelumnya dalam array. Tapi sebenarnya itu adalah pengurangan dari semua nilai sebelumnya. Saya sukaaccumulator
,aggregator
atausumSoFar
untuk kejelasan.Saya selalu menghindari mengubah metode prototipe dan menambah perpustakaan jadi ini solusi saya:
Menggunakan metode mengurangi array Array sudah cukup
sumber
a
) melakukan trik ketika menggunakanreduce
dengan objek: di iteratorion pertama,a
tidak akan menjadi objek pertama dariitems
array, melainkan akan menjadi0
.const sumBy = (items, prop) => items.reduce((a, b) => +a + +b[prop], 0);
Penggunaan:sumBy(traveler, 'Amount') // => 235
reduce
sintaksisnya terlihat sangat tumpul bagi saya. Otak saya masih "secaralet total = 0; items.forEach((item) => { total += item.price; });
let total = 0; items.forEach(item => total += item.price)
Saya pikir saya akan menjatuhkan dua sen saya pada ini: ini adalah salah satu operasi yang harus selalu berfungsi murni, tidak bergantung pada variabel eksternal. Beberapa sudah memberikan jawaban yang baik, menggunakan
reduce
adalah cara untuk pergi ke sini.Karena sebagian besar dari kita sudah mampu menggunakan sintaks ES2015, inilah proposisi saya:
Kami membuatnya menjadi fungsi yang tidak dapat diubah saat kami melakukannya. Apa
reduce
yang dilakukan di sini hanyalah ini: Mulailah dengan nilai0
untuk akumulator, dan tambahkan nilai dari item yang dilingkari saat itu.Yay untuk pemrograman fungsional dan ES2015! :)
sumber
Alternatif untuk peningkatan keterbacaan dan penggunaan
Map
danReduce
:Fungsi yang dapat digunakan kembali:
sumber
.reduce(*** => *** + ***, 0);
lain tidak ada pada "+1"Anda dapat melakukan hal berikut:
sumber
Ini bekerja untuk saya
TypeScript
danJavaScript
:Semoga bermanfaat.
sumber
Saya tidak yakin ini telah disebutkan. Tapi ada lodash fungsi untuk itu. Cuplikan di bawah ini di mana nilai adalah atribut Anda untuk dijumlahkan adalah 'nilai'.
Keduanya akan bekerja.
sumber
juga dapat menggunakan Array.prototype.forEach ()
sumber
Berikut ini adalah satu-liner menggunakan fungsi panah ES6.
sumber
Cara menjumlahkan array objek menggunakan Javascript
sumber
Dari berbagai objek
sumber
Saya sudah menggunakan jquery. Tapi saya pikir cukup intuitif untuk hanya memiliki:
Ini pada dasarnya hanya versi singkat dari jawaban @ akhouri.
sumber
Inilah solusi yang menurut saya lebih fleksibel:
Untuk mendapatkan jumlah, gunakan saja seperti itu:
sumber