Saya memiliki array objek yang ingin saya iterate untuk menghasilkan array yang difilter baru. Tetapi juga, saya perlu menyaring beberapa objek dari array baru tergantung dari suatu parameter. Saya mencoba ini:
function renderOptions(options) {
return options.map(function (option) {
if (!option.assigned) {
return (someNewObject);
}
});
}
Apakah itu pendekatan yang baik? Apakah ada metode yang lebih baik? Saya terbuka untuk menggunakan perpustakaan apa pun seperti lodash.
javascript
arrays
Daniel Calderon Mori
sumber
sumber
.reduce()
pasti lebih cepat daripada melakukan.filter(...).map(...)
yang saya lihat disarankan di tempat lain. Saya membuat Tes JSPerf untuk mendemonstrasikan stackoverflow.com/a/47877054/2379922Jawaban:
Anda harus menggunakannya
Array.reduce
untuk ini.Atau, peredam bisa menjadi fungsi murni, seperti ini
sumber
filtered
adalah sebuah objek. jadifiltered.push
tidak ditentukan untuk saya.filtered
menjadi objek. Ini karena saya tidak meneruskan "nilai awal" - array kosong ([]
) setelah fungsi pengurangan. mis salahvar reduced = options.reduce(function(filtered, option) { ... });
benarvar reduced = options.reduce(function(filtered, option) { ... }, []);
reduce
sini, Anda bisa menggunakanforEach
karena di setiap iterasi Anda mengubah arrayfiltered
dan dengan demikian itu tidak berfungsi murni. Itu akan menjadi acara yang lebih mudah dibaca dan kompak.Gunakan pengurangan, Luke!
sumber
Sejak 2019, Array.prototype.flatMap adalah pilihan yang baik.
Dari halaman MDN yang ditautkan di atas:
sumber
flatMap
baru saja diperkenalkan dan dukungan browsernya terbatas . Anda mungkin ingin menggunakan polyfill / shims resmi: flatMap dan flat .Dengan ES6 Anda dapat melakukannya dengan sangat singkat:
options.filter(opt => !opt.assigned).map(opt => someNewObject)
sumber
Satu baris
reduce
dengan sintaksis penyebaran mewah ES6 ada di sini!sumber
result
... sepertifilter(assigned).map(name)
solusi...assigned ? [name] : []
- mungkin lebih mudah dibaca...(assigned ? [name] : [])
Saya akan berkomentar, tetapi saya tidak memiliki reputasi yang diperlukan. Sebuah peningkatan kecil untuk jawaban Maxim Kuzmin yang sebaliknya sangat baik untuk membuatnya lebih efisien:
Penjelasan
Alih-alih menyebarkan seluruh hasil berulang untuk setiap iterasi, kami hanya menambahkan ke array, dan hanya ketika sebenarnya ada nilai untuk disisipkan.
sumber
Gunakan Array.prototy.filter itu sendiri
sumber
Pada titik tertentu, bukankah lebih mudah (atau semudah) menggunakan a
forEach
Namun alangkah baiknya jika ada
malter()
ataufap()
fungsi yang menggabungkanmap
danfilter
fungsinya. Ini akan berfungsi seperti filter, kecuali bukannya mengembalikan benar atau salah, itu akan mengembalikan objek apa pun atau null / tidak terdefinisi.sumber
Saya mengoptimalkan jawaban dengan poin-poin berikut:
if (cond) { stmt; }
sebagaicond && stmt;
Saya akan menyajikan dua solusi, satu menggunakan forEach , yang lainnya dengan mengurangi :
Solusi 1: Menggunakan forEach
Solusi 2: Menggunakan mengurangi
Saya serahkan kepada Anda untuk memutuskan solusi mana yang harus dicari.
sumber
cond && stmt;
? Ini jauh lebih sulit dibaca dan tidak menawarkan manfaat sama sekali.Menggunakan pengurangan, Anda dapat melakukan ini dalam satu fungsi Array.prototype. Ini akan mengambil semua angka genap dari array.
Anda dapat menggunakan metode yang sama dan menggeneralisasikannya untuk objek Anda, seperti ini.
arr
sekarang akan berisi objek yang difilter.sumber
Penggunaan langsung
.reduce
bisa sulit dibaca, jadi saya sarankan membuat fungsi yang menghasilkan peredam untuk Anda:Gunakan seperti ini:
sumber