[関数式プログラミングとES 6+]4.map、filter、reduceをカスタマイズすると、多形性に役立ちます.


map()


抽出する値を返す関数と反復器を使用して、新しい配列を作成し、返します.
const map = (f, iter) => { // iterator iter와 내부함수 f를 전달받는다.
  const result = [];
  for (const el of iter)
    result.push(f(el));
  return result; // FP는 side effect를 일으키지 않고 순수하게 결과값 그대로 반환한다.
}

地図の多形性


既存の地図方法はArrayです.prototypeで定義されているため、Arrayを継承しない他のiterableではmapメソッドは使用できません.
ただし、前に作成したmap関数はpropertyにメソッドが存在するかどうかは自由です.
->すべてのiterableをパラメータとして得ることができるので、多形性(多様なタイプの能力を持つ)の面で有利である.

filter()


iterableを巡って、条件に合致する値を内部関数と判断し、新しい配列に戻る
const filter = (f, iter) => {
  let result = [];
  for (const el of iter)
    if (f(el)) result.push(el); /
  
  return result;
}

reduce()


iterable値を1つの値に縮小します.
const reduce = (f, acc, iter) => {
  for (const el of iter) 
    acc = f(acc, el);
  
  return acc;
}
  • accパラメータが渡されない場合、iterの最初の値がaccとして使用されます.(ex.24579142であればaccは1、iterは[2,3].
  • 実装は次のコードになります.
    const reduce = (f, acc, iter) => {
      if (!iter) {
      	iter = acc[Symbol.iterator]();
        acc = iter.next().value;
      }
      
      for (const el of iter) 
        acc = f(acc, el);
      
      return acc;
    }