Ada metode Array yang bagus reduce()
untuk mendapatkan satu nilai dari Array. Contoh:
[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
Apa cara terbaik untuk mencapai hal yang sama dengan benda? Saya ingin melakukan ini:
{
a: {value:1},
b: {value:2},
c: {value:3}
}.reduce(function(previous, current, index, array){
return previous.value + current.value;
});
Namun, Object tampaknya tidak reduce()
menerapkan metode apa pun .
javascript
arrays
object
reduce
Pavel S.
sumber
sumber
Underscore.js
?reduce
metode. Saya akan memeriksa di sana. Padahal, solusinya sepertinya tidak terlalu sulit._
memang ada pengurangan untuk objek. Tidak yakin apakah itu berfungsi secara tidak sengaja atau jika dukungan objek disengaja, tetapi memang Anda dapat melewatkan objek seperti dalam contoh pertanyaan ini, dan itu akan (secara konseptual)for..in
memanggil fungsi iterator Anda dengan nilai-nilai yang ditemukan pada setiap tombol.Jawaban:
Apa yang sebenarnya Anda inginkan dalam kasus ini adalah
Object.values
. Berikut ini adalah implementasi ES6 singkat dengan itu dalam pikiran:atau hanya:
sumber
Salah satu pilihan akan
reduce
dengankeys()
:Dengan ini, Anda ingin menentukan nilai awal atau putaran pertama
'a' + 2
.Jika Anda ingin hasilnya sebagai Obyek (
{ value: ... }
), Anda harus menginisialisasi dan mengembalikan objek setiap kali:sumber
@babel/plugin-proposal-object-rest-spread
plugin, saya menyebarkan nilai akumulator di kembalinya mengurangi dan itu bekerja seperti pesona, tetapi saya bertanya-tanya apakah saya melakukan sesuatu yang salah, karena saya melewati obejct ke nilai awal mengurangi dan jawaban Anda membuktikan kepada saya bahwa saya melakukan hal yang benar!Implementasi ES6: Object.entries ()
sumber
Object.entries(o); // returns [['value',1],['value',2],['value',3]]
function (total, pair)
kefunction (total, [key, value])
entries
merupakan cara yang lebih bersih untuk melakukan hal inikeys
, ia kurang berkinerja. hackernoon.com/...Pertama-tama, Anda tidak cukup mengerti apa nilai pengurangan sebelumnya.
Dalam kode pseudo yang Anda miliki
return previous.value + current.value
, makaprevious
nilainya akan berupa angka pada panggilan berikutnya, bukan objek.Kedua,
reduce
adalah metode Array, bukan metode Object, dan Anda tidak bisa bergantung pada urutan ketika Anda mengulangi properti objek (lihat: https://developer.mozilla.org/en-US/docs/ JavaScript / Referensi / Pernyataan / untuk ... dalam , ini juga berlaku untuk Object.keys ); jadi saya tidak yakin jika mendaftarreduce
objek lebih masuk akal.Namun, jika pesanannya tidak penting, Anda dapat memiliki:
Atau Anda bisa memetakan nilai objek:
PS dalam ES6 dengan sintaks fungsi tanda panah lemak (sudah ada di Firefox Nightly), Anda dapat sedikit menyusut:
sumber
1:
2:
3:
sumber
Perluas Object.prototype.
Contoh penggunaan.
tidak, wah !! ;-)
sumber
Object.entries()
pada 2021Anda dapat menggunakan ekspresi generator (didukung di semua browser selama bertahun-tahun sekarang, dan di Node) untuk mendapatkan pasangan nilai kunci dalam daftar yang dapat Anda kurangi pada:
sumber
Objek dapat diubah menjadi array dengan: Object.entries () , Object.keys () , Object.values () , dan kemudian direduksi menjadi array. Tetapi Anda juga dapat mengurangi objek tanpa membuat array perantara.
Saya telah membuat sebuah pembantu kecil perpustakaan odict untuk bekerja dengan objek.
Ini memiliki
reduce
fungsi yang sangat mirip dengan Array.prototype.reduce () :Anda juga dapat menetapkannya untuk:
karena metode ini sangat berguna!
Jadi jawaban untuk pertanyaan Anda adalah:
sumber
Jika Anda dapat menggunakan array, gunakan array, panjang dan urutan array adalah setengah nilainya.
/ * nilai yang dikembalikan: (Nomor) 6 * /
sumber
Ini tidak terlalu sulit untuk diterapkan sendiri:
Beraksi:
Anda juga bisa menambahkannya ke prototipe Obyek:
sumber
Karena belum benar-benar dikonfirmasi dalam jawaban, Underscore
reduce
juga berfungsi untuk ini.Catatan,
_.reduce
akan mengembalikan satu-satunya nilai (objek atau sebaliknya) jika objek daftar hanya memiliki satu item, tanpa memanggil fungsi iterator.sumber
Cobalah fungsi panah satu liner ini
sumber
Coba yang ini. Ini akan mengurutkan angka dari variabel lain.
sumber