サンプルプログラム4(PL JavaScript編)

配列を使う(2)

3. 高階関数

  1. map の例

    var a=[1,2,3,4,5]
    a.map(e=>e*3)        // 各要素を3倍する
    
    [...Array(30).keys()].map(e=>2**e)   // 2のべき乗の数が並ぶ配列
    
    [...Array(30).keys()].map((e,i)=>[2**e,i])   // 乗数を添えたタプル列
  2. filter

    [...Array(30).keys()].filter(e=>e%3==0)      // 3の倍数だけを選ぶ
  3. reduce

    [...Array(30+1).keys()].reduce((r,e)=>r+e)   // 階和(1から30まで)
    [...Array(30+1).keys()].slice(1).reduce((r,e)=>r*e)  // 階乗(同)
        // 階乗の場合はsliceで0を取り除いておかないと意味のない数値になる
        // 大きな数になるとJSでは通常のNumber型で扱えず、
        // Float型で近似することになる。整数で計算するには、
    [...Array(30+1).keys()].slice(1).map(e=>BigInt(e)).reduce((r,e)=>r*e)
       // のようにBigInt型に変換してから掛け合わせる
       // (末尾に 'n' が付加されている表現が BigInt)
    [...Array(30).keys()].reduce((r,e)=>r+e,"")
       // 初期値として空文字列を渡すと、同じ `+` 演算子を使っていても、
       // 文字列の連結として処理される

4. 様々なメソッド

5. 練習課題

1から100までの数を4乗した数の列の中で、 (どこかの桁に)6という文字を含むものだけを選び出す(順々に作っていこう)。

復習課題

(第9回資料末尾に掲示したプログラムに相当するもの)

  1. 1~100からなる配列

    var a=[...Array(101).keys()].slice(1)
  2. (1.の配列について)各要素を3倍する

    a.map(n=>n*3)
  3. (1.の配列について)3の倍数だけを選び出す

    a.filter(n=>n%3==0)
  4. a’ ~ ’z’までの文字列からなるサイズ26の配列:

    [...Array("z".charCodeAt()+1).keys()].
        slice("a".charCodeAt()).
        map(e=>String.fromCharCode(e))
  5. [1, 2, 3, 1, 2, 3, …] と繰り返す サイズ20の配列

    Array(20).fill().map((_,i)=>i%3+1)
  6. 乱数からなる配列を作る

    Array(20).fill().map(()=>Math.random())
  7. 最大のものを見つける

    a.reduce((r,v)=>r>v?r:v)

    発展:最大のものが何番目だったか:

    a.map((e,i)=>[e,i]).
      reduce(([mx_v,mx_p],[e,i])=>mx_v>e?[mx_v,mx_p]:[e,i])