JavaScriptでは高階関数が使えます。

高階関数とは、関数の戻り値や、引数として使える関数のことをさします。

これだけ聴いてもピンとこないと思いますので、実際に高階関数を使ってみることでそのメリットを見てみます。

配列に対する操作

配列に対する操作を行う際は、for文を用います。

そのため、以下のようなコードは イディオムとなっており、ソースコード中に頻繁に現れます。

let array = [1, 2, 3];
for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
}

しかし、以下のような処理の場合はどうでしょうか。

let array1 = [1, 2, 3];

for (let i = 0; i < array.length; i++) {
  console.log(array[i]);
}

let array2 = [4, 5, 6];

for (let i = 0; i < array2.length; i++) {
  alert(array[i]);
}

このようなとき、for文の内容だけがことなっておりそれ以外はほとんど一緒です。

そのため、以下のように高階関数を用いることで、記述を省略できます。

let array1 = [1, 2, 3];


forEach(console.log, array1);


let array2 = [4, 5, 6];

forEach(alert array2);

function forEach(fn, a) {
  for (let i = 0; i < array2.length; i++) {
    fn(array[i]);
  }

}

これによって、差分のみを記述するプログラミングが可能となります。

map.js

let array = [1, 2, 3];
let newArray = map(array, (n) => n * 2);

console.log(newArray);

function map(array, fn) {
    let a = [];
    for (let i = 0; i < array.length; i++) {
        a[i] = fn(array[i]);
    }
    return a;
}

reduce.js

const nArray = [1, 2, 3];

let sum = reduce((x, y) => x + y, nArray, 0);

console.log(sum);

function reduce(fn, a, init) {
    let s = init;
    for (let i = 0; i < a.length; i++) {
        s = fn(s, a[i]); 
    }
    return s;
}

filter.js

const array = [10, 20, 30];

let newArray = filter(array, e => e > 15);

console.log(newArray)

function filter(a, fn) {
    let n = [];
    for (let i = 0; i < a.length; i++) {
        let e = a[i];
        if (fn(e)) n.push(e);
    }
    return n;
}