forEach【要素処理】
reduce【隣接要素処理 (順方向)】
reduceRight【隣接要素処理 (逆方向)】

Array.prototype.forEach【要素処理】

メモ

概要

  • 各要素を指定関数で処理
    • 存在しない要素に対しては処理なし
    • コールバック関数で配列の変更も可能

関連

外部リンク

構文

array.forEach( callbackfn[, thisArg] )

なし
callbackfnコールバック関数 (詳細は下記参照)
thisArgcallbackfn内でthis で参照されるオブジェクト

TypeError callbackfnが呼び出し不可
コールバック関数 引数名 (例)説明
value要素値
index要素インデックス
array配列 オブジェクト
戻り値型説明
なし

// 偶数チェック
function func(value, index, array) {
  console.log(value, index, array);
  if ((value % 2) == 0) {
    console.log("偶数");
  }
}
// 倍数チェック
function func2(value, index, array) {
  console.log(value, index, array, this);
  if ((value % this) == 0) {
    console.log(this + "の倍数");
  }
}

var array = [1, , 3, 4, 5, 6]; // 2番目の項目は省略
array.forEach(func);
// 出力:1 0 [1, 2: 3, 3: 4, 4: 5, 5: 6]
// 出力:3 2 [1, 2: 3, 3: 4, 4: 5, 5: 6]
// 出力:4 3 [1, 2: 3, 3: 4, 4: 5, 5: 6]
// 出力:偶数
// 出力:5 4 [1, 2: 3, 3: 4, 4: 5, 5: 6]
// 出力:6 5 [1, 2: 3, 3: 4, 4: 5, 5: 6]
// 出力:偶数

array.forEach(func2, 3); // 初期値指定
// 出力:1 0 [1, 2: 3, 3: 4, 4: 5, 5: 6] Number { 3 }
// 出力:3 2 [1, 2: 3, 3: 4, 4: 5, 5: 6] Number { 3 }
// 出力:3の倍数
// 出力:4 3 [1, 2: 3, 3: 4, 4: 5, 5: 6] Number { 3 }
// 出力:5 4 [1, 2: 3, 3: 4, 4: 5, 5: 6] Number { 3 }
// 出力:6 5 [1, 2: 3, 3: 4, 4: 5, 5: 6] Number { 3 }
// 出力:3の倍数

array.forEach(null);    // TypeError 例外 (関数不正)

Array.prototype.reduce【隣接要素処理 (順方向)】

メモ

概要

  • 各要素を順方向に処理 (直前要素の処理結果を引継ぎ)
    • 存在しない要素に対しては処理なし
    • コールバック関数で配列の変更も可能

関連

外部リンク

構文

array.reduce( callbackfn[, initialValue] )

最後のcallbackfnの戻り値 (空配列の場合、initialValue)
callbackfnコールバック関数 (詳細は下記参照)
initialValue初期値 (初回callbackfn呼び出しのpreviousValue)
省略:2つ目の要素からcallbackfnが呼び出され、1つ目の要素値がpreviousValue引数

TypeError 
callbackfnが呼び出し不可
空配列でinitialValueが未指定
コールバック関数 引数名 (例)説明
previousValue指定された初期値 (初回) または 1つ前の呼び出し時の戻り値
currentValue現在の要素値
currentIndex現在の要素インデックス
array配列 オブジェクト
戻り値型説明
任意次回の呼び出しpreviousValue引数

// 隣接要素の差分 (戻り値は現在の要素値)
function func(previousValue, currentValue, currentIndex, array) {
  console.log(previousValue, currentValue, currentIndex, array, (currentValue - previousValue));
  return currentValue;
}

var array = [1, , 3, 9, 7]; // 2番目の項目は省略
console.log(array.reduce(func));
// 出力:1 3 2 [1, 2: 3, 3: 9, 4: 7] 2
// 出力:3 9 3 [1, 2: 3, 3: 9, 4: 7] 6
// 出力:9 7 4 [1, 2: 3, 3: 9, 4: 7] -2
// 出力:7

console.log(array.reduce(func, 100)); // 初期値指定
// 出力:100 1 0 [1, 2: 3, 3: 9, 4: 7] -99
// 出力:1 3 2 [1, 2: 3, 3: 9, 4: 7] 2
// 出力:3 9 3 [1, 2: 3, 3: 9, 4: 7] 6
// 出力:9 7 4 [1, 2: 3, 3: 9, 4: 7] -2
// 出力:7

array = []; // 空配列
console.log(array.reduce(func, 123)); // 出力:123
console.log(array.reduce(func));      // TypeError 例外 (空配列で初期値が未指定)
console.log(array.reduce(null));      // TypeError 例外 (関数不正)

Array.prototype.reduceRight【隣接要素処理 (逆方向)】

メモ

概要

  • 各要素を逆方向に処理 (直前要素の処理結果を引継ぎ)
    • 存在しない要素に対しては処理なし
    • コールバック関数で配列の変更も可能

関連

外部リンク

構文

array.reduceRight( callbackfn[, initialValue] )

最後のcallbackfnの戻り値 (空配列の場合、initialValue)
callbackfnコールバック関数 (詳細は下記参照)
initialValue初期値 (初回callbackfn呼び出しの previousValue)
省略:最後から2つ目の要素からcallbackfnが呼び出され、最後の要素値が previousValue 引数

TypeError 
callbackfnが呼び出し不可
空配列でinitialValueが未指定
コールバック関数 引数名 (例)説明
previousValue指定された初期値 (初回) または 1つ前の呼び出し時の戻り値
currentValue現在の要素値
currentIndex現在の要素インデックス
array配列 オブジェクト
戻り値型説明
任意次回の呼び出しpreviousValue引数

// 隣接要素の差分 (戻り値は現在の要素値)
function func(previousValue, currentValue, currentIndex, array) {
  console.log(previousValue, currentValue, currentIndex, array, (currentValue - previousValue));
  return currentValue;
}

var array = [1, , 3, 9, 7]; // 2番目の項目は省略
console.log(array.reduceRight(func));
// 出力:7 9 3 [1, 2: 3, 3: 9, 4: 7] 2
// 出力:9 3 2 [1, 2: 3, 3: 9, 4: 7] -6
// 出力:3 1 0 [1, 2: 3, 3: 9, 4: 7] -2
// 出力:1

console.log(array.reduceRight(func, 100)); // 初期値指定
// 出力:100 7 4 [1, 2: 3, 3: 9, 4: 7] -93
// 出力:7 9 3 [1, 2: 3, 3: 9, 4: 7] 2
// 出力:9 3 2 [1, 2: 3, 3: 9, 4: 7] -6
// 出力:3 1 0 [1, 2: 3, 3: 9, 4: 7] -2
// 出力:1

array = []; // 空配列
console.log(array.reduceRight(func, 123));   // 出力:123
console.log(array.reduceRight(func));        // TypeError 例外 (空配列で初期値が未指定)
console.log(array.reduceRight(null));        // TypeError 例外 (関数不正)