reduceとflatとmap
少し前のメモなので、もうご存知かもしれませんが、見かけたのでmrsekut.icon
以下の2つの文章はちょっと違和感あります
code:js
// flatの例
const a = [1,2,3,4].flat() code:js
// map + flat
const b1 = arr.map(f) // 10], 20, 30, 40, [50 // flatMap
だから「filterとmapを1つに」ではなく、「flatとmapを1つに」な気がします
あ、このページでやりたかったのはmap().flat()ではなくfilter().map()ですtakker.icon
説明が足りなすぎたので追記しました
またreduceは、mapやfilterよりも抽象度の高いもので、
その証拠にreduceを使うとmapやfilterを再実装できます
code:js
const arr = 0,1,2,3,4,5,6,7,8,9,; // map相当
const map = (arr, f) => arr.reduce((acc, cur) => acc.concat(f(cur)), [])
console.log(map(arr, n => n*10))
// filter相当
const filter = (arr, f) => arr.reduce((acc, cur) => f(cur) ? acc.concat(cur) : acc , [])
console.log(filter(arr, n => n > 3))
すごいtakker.icon
なのでいつもflatmapでなんとか乗り切っていました
最近reduceを使わないと解決できない場面がちょくちょくあったので、以前よりは理解度上がっているかも……?
だから「reduceとmapの組み合わせ」という文章に違和感があります
これはreduceの役割を勘違いしていたのが原因でしたtakker.icon
でも狭義にはreduceって足し上げとか、配列上の全要素を舐めて得られる情報を抽出する、と自分は読むなmiyamonz.icon
Haskell界隈(?)では、こういうのを「畳み込み」と呼んでて1つの面白いトピックになってたりしますmrsekut.icon 畳み込み、面白そうですね。今度調べてみますtakker.icon
連結リストを扱える言語を触っているとreduceやfoldでmapやreverseのシミュレート実装が簡単にできて面白いkuuote.icon
配列を舐めて畳むという動作が綺麗に抽象化されていて感動する(個人の感想)
foldでいくつか再実装してるノートあったmrsekut.icon
サンプルコードまで書いていただきありがとうございます!takker.icon
元ページの方に修正を加えておきました