Upgrade to Pro — share decks privately, control downloads, hide ads and more …

List processing in JS: functional programming a...

chikoski
December 28, 2016

List processing in JS: functional programming approach

chikoski

December 28, 2016
Tweet

More Decks by chikoski

Other Decks in Technology

Transcript

  1. /4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮׷8FC׾⡲׷⠓爡ד⫴ְגְתׅ ˖ Ĥ Ĥ ˘ ̔խĥ ˖ 'JSFGPY

    %FW5PPMT 'JSFGPYGPSJ04 ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73 ˖ فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅׷ךָ㥨ֹדׅ ˖ 㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ
  2. debugger.html:再開発中のFirefox 組み込みのデバッガー • React と Redux、flow を使って実装されています • スタンドアローンで実行できます •

    Firefox だけでなく、Google Chromeやnode.jsで動いているコードもデバッグできます • https://github.com/devtools-html/debugger.html
  3. 目的 ツール UIコンポーネント Ract 状態管理 Redux, React-Redux 実装言語 Flow ビルドツール

    webpack テスト ESLint, mocha, mochitest パッケージ管理 Yarn ツールチェーン
  4. JSON <\ EFTDSJQUJPO  EFWUPPMT'SPOUFOE6SMEFWUPPMTJOTQFDUPSIUNM XTMPDBMIPTU EFWUPPMTQBHFDBGBEBBCDG  GBWJDPO6SMIUUQTXXXHPPHMFDPNJNBHFTJDPOTQSPEVDUDISPNFQOH 

    JEDBGBEBBCDG  UJUMFأة٦زؖ؎س  UZQFQBHF  VSMIUUQTXXXHPPHMFDPNJOUMKBDISPNFCSPXTFSXFMDPNFIUNM  XFC4PDLFU%FCVHHFS6SMXTMPDBMIPTUEFWUPPMTQBHF DBGBEBBCDG ^> Chromeで開いているタブの一覧は、JSONで取得できます
  5. DPOTUQBOFMT\ 'JSFGPYUIJTSFOEFS'JSFGPY1BOFM  $ISPNFUIJTSFOEFS$ISPNF1BOFM  /PEFUIJTSFOEFS/PEF1BOFM ^ TOJQ QBOFMT<UIJTTUBUFTFMFDUFE1BOF> 

     UBCTWBMVF4FR NBQ UBCEPNMJ  \DMBTT/BNFUBC  LFZUBCHFU JE  PO$MJDL \ XJOEPXMPDBUJPO HFU5BC63- UBC QBSBN/BNF  ^ ^  EPNEJW \DMBTT/BNFUBCUJUMF^  UBCHFU UJUMF  EPNEJW \DMBTT/BNFUBCVSM^  UBCHFU VSM   開いているタブ一覧の描画部分
  6. DPOTUMJTU<     ˘  > MFUTVN GPS

    MFUJJMJTUMFOHUIJ \ JG MJTU<J> \ TVN.BUIQPX MJTU<>   TVN ^ ^ DPOTPMFMPH Aַ׵תדך꟦ך⩐侧ך✳⛦ㄤכ\TVN^A  タブの描画はこれと同じ構造をしています
  7. GVODUJPOBEE B C \ SFUVSOB C ^ WBSBEEGVODUJPO B C

    \ SFUVSOB C ^ WBSBEE B C B C DPOTPMFMPH A \BEE   ^A  JavaScriptで関数は値です
  8. DPOTUPQFSBUJPO\ BEE B C B C  TVC B C

    BC  NVM B C B C  EJW B C BC  ^ PQFSBUJPOBEE    PQFSBUJPOTVC    PQFSBUJPONVM    PQFSBUJPOEJW    DPOTUPQFSBUJPOOFX.BQ < <BEE  B C B C>  <TVC  B C BC>  <NVM  B C B C>  <EJW  B C BC>  >  PQFSBUJPOHFU BEE    PQFSBUJPOHFU TVC    PQFSBUJPOHFU NVM    PQFSBUJPOHFU EJW    値なので、オブジェクトの属性にできます
  9. GVODUJPOIFMMP OBNF \ SFUVSOA)FMMP \OBNF^A ^ GVODUJPOHSFFUJOHT OBNF NFTTBHF#VJMEFS \

    DPOTPMFMPH NFTTBHF#VJMEFS OBNF  ^ HSFFUJOHT XPSME IFMMP  高階関数:関数を引数にとったり、関数を返したりする関数
  10. DPOTUMJTU<     ˘  > DPOTUJT&WFO/VNCFSOO DPOTUQPXO.BUIQPX

    O   DPOTUBEE B C B C DPOTUTVNMJTUMUFS JT&WFO/VNCFS  NBQ QPX  SFEVDF BEE  DPOTPMFMPH Aַ׵תדך꟦ך⩐侧ך✳⛦ㄤכ\TVN^A  高階関数を使うと、リスト処理がキレイにかけます
  11. DPOTUMJTU<   > GVODUJPOJT&WFO/VNCFS O \ SFUVSOO ^ DPOTUFWFO/VNCFST

    MJTUGJMUFS JT&WFO/VNCFS  Array.prototype.filter:関数の評価値が true のものを集めた新しい配列を作成する     USVF GBMTF  
  12. DPOTUMJTU<   > GVODUJPOBEE B C \ SFUVSOB C

    ^ DPOTUTVNMJTUSFEVDF BEE      B C     B C      B C  Array.prototype.reduce:左畳み込み
  13. GVODUJPOSBOHF GSPN UP \ DPOTUTJ[FUPGSPN  SFUVSO"SSBZ TJ[F MM 

     NBQ WBMVF JOEFY JOEFY GSPN  ^ DPOTUTVNSBOHF   MUFS OO  SFEVDF B C B C  DPOTPMFMPH Aַ׵תדך꟦ך⩐侧ך筨ㄤכ\TVN^A  map:配列の要素1つ1つに関数を適用して、その結果を集めた新しい配列を作ります
  14. DPOTUFOEQPJOUAIUUQTBQJOZUJNFTDPNTWDUPQTUPSJFTW IPNFKTPO BQJLFZ\BQJ,FZ^A DPOTUDPOUBJOFSEPDVNFOURVFSZ4FMFDUPS DPOUBJOFS  GFUDI FOEQPJOU UIFO SFTQPOTFSFTQPOTFKTPO

     UIFO EBUBEBUBSFTVMUT  UIFO BSUJDMFTSFOEFS BSUJDMFT  UIFO SFOEFSFEDPOUBJOFSBQQFOE$IJME SFOEFSFE  New York Times の新着記事一覧の取得
  15. GVODUJPOSFOEFS BSUJDMFT \ DPOTUDPOUBJOFSEPDVNFOURVFSZ4FMFDUPS DPOUBJOFS  SFUVSOBSUJDMFTNBQ BSUJDMFSFOEFS"SUJDMF BSUJDMF 

    VOTIJGU EPDVNFOUDSFBUF'SBHNFOU  SFEVDF QBSFOU FMN \ QBSFOUBQQFOE$IJME FMN  SFUVSOQBSFOU ^  ^ レンダリング:記事を表すオブジェクトを、HTMLElementNodeに変換することと捉える
  16. GVODUJPOSFOEFS"SUJDMF BSUJDMF \ DPOTUUFNQMBUFEPDVNFUORVFSZ4FMFDUPS UFNQMBUFBSUJDMF  DPOTUNFEJBBSUJDMFNFEJBOE NNGPSNBUUIVNCOBJM  UFNQMBUFRVFSZ4FMFDUPS

    UIVNCOBJM TSDNFEBVSM UFNQMBUFRVFSZ4FMFDUPS UJUMF UFYU$POUFOUBSUJDMFUJUMF SFUVSOEPDVNFOUJNQPSU/PEF UFNQMBUF USVF  ^ 各記事のレンダリング例
  17. まとめ • map / reduce は強力なフレームワークです • ほとんどの繰り返し処理をこれで記述できます • 繰り返す処理にのみ注力してプログラムをかけます

    • つまりコードが読みやすくなる • filter / find を使うとキレイに必要なデータだけを抜き出せます • 元の配列を破壊しません • プログラム中の、ほかの部分への影響を与えなません • デバッグがしやすくなります • debugger.html ためしてください!