引数が Reducer のみの場合 ~ reduce(reducer) ~
arrayの要素数(n) | reducerの実行回数 | 備考 |
---|---|---|
n == 0 | - | ❌ エラーがスローされる |
n == 1 | n-1 (0) |
reducer は実効されず、reduce の戻り値は array[0] となる
|
n >= 2 | n-1 | n == 2 の場合、引数array[0] , array[1] で 1 回実行される |
初期値も与えられている場合 ~ reduce(reducer, initialValue) ~
arrayの要素数(n) | reducerの実行回数 | 備考 |
---|---|---|
n == 0 | n (0) |
reducer は実効されず、reduce の戻り値は initialValue となる
|
n == 1 | n |
reducer は 引数initialValue , array[0] で 1 回実行される |
n >= 2 | n |
reducer は n 回実行される |
補足
以下の式はtrue
となる
[initialValue, ...array].reduce(reducer) === array.reduce(reducer, initialValue)
検証用スニペット1
const h1 = (msg) => console.group(`%c${msg}`, `font-size: 1.5em;`);
const h2 = (msg) => console.group(`%c${msg}`, `font-size: 1.2em;`);
const countKey = "execute reducer"; let reducerの実行回数 = 0;
const reducer = (acc, val)=> {
console.count(countKey); reducerの実行回数++;
console.log({acc,val});
return "accumulator";
}
const 検証 = (...reducerArgs) => (array) => {
h2(`${JSON.stringify(array)} を検証`);
let reduceの戻り値;
try {
reduceの戻り値 = array.reduce(...reducerArgs);
} catch(e) { console.error(e); }
console.table({arrayの要素数: array.length, reducerの実行回数, reduceの戻り値})
console.countReset(countKey); reducerの実行回数 = 0;
console.groupEnd();
}
const a0 = "array[0]", a1 = "array[1]"
h1("引数が Reducer のみの場合");
const reducerのみの場合を検証 = 検証(reducer)
reducerのみの場合を検証([]);
reducerのみの場合を検証([a0]);
reducerのみの場合を検証([a0,a1]);
console.groupEnd();
h1("初期値も与えられている場合");
const 初期値ありの場合を検証 = 検証(reducer, "initialValue");
初期値ありの場合を検証([]);
初期値ありの場合を検証([a0]);
初期値ありの場合を検証([a0,a1]);
console.groupEnd();
検証用スニペット2
const reducer = (a, b) => `${a} + ${b}`;
const initialValue = 1, array = [2,3];
console.assert([initialValue, ...array].reduce(reducer) === "1 + 2 + 3");
console.assert([initialValue, ...array].reduce(reducer)
=== array.reduce(reducer, initialValue));
console.assert([1].reduce(reducer) === [].reduce(reducer,1));
console.assert([1,2].reduce(reducer) === [2].reduce(reducer,1));