Bagaimana saya bisa melewatkan elemen array .map
?
Kode saya:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Ini akan mengembalikan:
["img.png", null, "img.png"]
javascript
Ismail
sumber
sumber
img.src
jika hasil dari pop split! = = json?undefined
akan dimasukkan ke dalam array, bukannull
. Tidak lebih baik ...Jawaban:
Hanya
.filter()
itu yang pertama:Jika Anda tidak ingin melakukan itu, yang tidak masuk akal karena memiliki biaya, Anda dapat menggunakan yang lebih umum
.reduce()
. Secara umum Anda dapat mengekspresikan.map()
dalam hal.reduce
:dapat ditulis sebagai
Jadi jika Anda perlu melewati elemen, Anda dapat melakukannya dengan mudah dengan
.reduce()
:Dalam versi itu, kode dalam
.filter()
dari sampel pertama adalah bagian dari.reduce()
panggilan balik. Sumber gambar hanya didorong ke array hasil dalam kasus di mana operasi filter akan menyimpannya.sumber
.reduce()
dan lakukan semuanya dalam satu pass, meskipun menurut kinerja saya ragu itu akan membuat perbedaan yang signifikan.null
,undefined
,NaN
dll) itu akan baik jika kita bisa memanfaatkan salah satu di dalammap()
sebagai indikator bahwa objek ini peta apa-apa dan harus dilewati. Saya sering menemukan array yang ingin saya petakan di 98% (misalnya:String.split()
meninggalkan satu string kosong di akhir, yang tidak saya pedulikan). Terima kasih atas jawaban Anda :).reduce()
adalah semacam-baseline "melakukan apa pun yang Anda inginkan" berfungsi, karena Anda memiliki kontrol penuh atas nilai kembali. Anda mungkin tertarik pada karya luar biasa oleh Rich Hickey di Clojure mengenai konsep transduser ..map()
. Namun Anda dapat menggunakannya.reduce()
, jadi saya akan menambahkannya.Saya pikir cara paling sederhana untuk melewati beberapa elemen dari array adalah dengan menggunakan metode filter () .
Dengan menggunakan metode ini ( ES5 ) dan sintaks ES6 Anda dapat menulis kode Anda dalam satu baris , dan ini akan mengembalikan apa yang Anda inginkan :
sumber
.filter()
dibuat untukforEach
dan menyelesaikannya dalam satu pass, bukan dua?O(n)
dalam kompleksitas pengukuran dan silakan lihat setidaknya dua artikel ini juga: frontendcollisionblog.com/javascript/2015/08/15/… dan coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-sebaliknya Semua yang terbaik!Sejak 2019, Array.prototype.flatMap adalah pilihan yang bagus.
Dari MDN :
sumber
TLDR: Anda dapat memfilter array Anda terlebih dahulu dan kemudian melakukan peta Anda tetapi ini akan membutuhkan dua lintasan pada array (filter mengembalikan array ke peta). Karena array ini kecil, itu adalah biaya kinerja yang sangat kecil. Anda juga dapat melakukan pengurangan sederhana. Namun, jika Anda ingin membayangkan kembali bagaimana hal ini dapat dilakukan dengan satu melewati array (atau tipe data apa pun), Anda dapat menggunakan ide yang disebut "transduser" yang dipopulerkan oleh Rich Hickey.
Menjawab:
Kita seharusnya tidak memerlukan peningkatan dot chaining dan operasi pada array
[].map(fn1).filter(f2)...
karena pendekatan ini menciptakan array menengah dalam memori pada setiapreducing
fungsi.Pendekatan terbaik beroperasi pada fungsi pereduksi aktual sehingga hanya ada satu pass data dan tidak ada array tambahan.
Fungsi reduksi adalah fungsi yang dilewatkan ke dalam
reduce
dan mengambil akumulator dan input dari sumber dan mengembalikan sesuatu yang tampak seperti akumulatorSumber: posting transduser cupang kaya
sumber
Inilah solusi yang menyenangkan:
Gunakan dengan operator mengikat :
sumber
map
,filter
danconcat
panggilan.Jawaban tanpa kasus tepi berlebihan:
sumber
Mengapa tidak menggunakan forEach loop saja?
Atau bahkan gunakan filter yang lebih sederhana:
sumber
map
biarkan seperti sekarang. (adalah 4 tahun yang lalu saya menanyakan pertanyaan ini, ketika saya tidak tahu apa-apa tentang pengkodean)The
.filter(Boolean)
akan menyaring nilai-nilai falsey di array yang diberikan, yang dalam kasus Anda adalahnull
.sumber
Berikut adalah metode utilitas (kompatibel ES5) yang hanya memetakan nilai-nilai bukan nol (menyembunyikan panggilan untuk mengurangi):
sumber
Saya menggunakan
.forEach
untuk mengulangi, dan mendorong hasil keresults
array kemudian menggunakannya, dengan solusi ini saya tidak akan mengulang array dua kalisumber
Untuk meramalkan komentar Felix Kling , Anda dapat menggunakan
.filter()
seperti ini:Itu akan menghapus nilai falsey dari array yang dikembalikan oleh
.map()
Anda dapat menyederhanakannya lebih lanjut seperti ini:
Atau bahkan sebagai satu-liner menggunakan fungsi panah, perusakan objek dan
&&
operator:sumber
Ini adalah versi terbaru dari kode yang disediakan oleh @theprtk . Ini adalah sedikit dibersihkan untuk menunjukkan versi umum sementara memiliki contoh.
Catatan: Saya akan menambahkan ini sebagai komentar pada postingannya tetapi saya belum memiliki reputasi yang cukup
sumber
Anda dapat menggunakan metode setelah Anda
map()
. Metodefilter()
misalnya dalam kasus Anda:Filter metode:
Kemudian, hanya item yang ada dalam array baru
sourceFiltered
.sumber