JavaScript | すべての要素に順番に同じ処理を行い、新しい配列を作る

JavaScript JavaScript
スポンサーリンク

では、さきほどの 問題 A・B・C のそれぞれについて、
「ありがちな間違いパターン」→「実際の挙動」→「正しい修正版」
をステップ実行(console.log付き)で見せる実験コードを用意します。


実験 1:return を忘れたパターン(問題A)

「map の中で return を書き忘れる」と、どうなるか確認します。

// ❌ 間違いパターン
let arr = [2, 4, 6];

let resultWrong = arr.map(n => {
  console.log('処理中の値:', n);
  n / 3; // ← return を書いていない!
});

console.log('結果(間違い):', resultWrong);
// => [undefined, undefined, undefined]

// ✅ 正しいパターン
let resultCorrect = arr.map(n => {
  console.log('処理中の値:', n);
  return n / 3; // ← return で返す
});

console.log('結果(正しい):', resultCorrect);
// => [0.666..., 1.333..., 2]
JavaScript

🔍 解説:

  • map の中で return された値だけが「新しい配列」に入る。
  • return を書かないと、暗黙的に undefined が返る。
  • したがって結果は [undefined, undefined, undefined]

実験 2:アロー関数でオブジェクトを返すときの落とし穴(問題B)

アロー関数で {} を使うときの カッコの書き忘れ に注意。

let items = [{name: 'Pen', price: 100}, {name: 'Notebook', price: 250}];

// ❌ 間違いパターン:丸括弧を付けない
let wrong = items.map(item => { name: item.name, priceWithTax: item.price * 1.1 });

console.log('結果(間違い):', wrong);
// => [undefined, undefined]

// ✅ 正しいパターン:オブジェクト全体を ( ) で囲む
let correct = items.map(item => ({
  name: item.name,
  priceWithTax: item.price * 1.1
}));

console.log('結果(正しい):', correct);
// => [{name:'Pen', priceWithTax:110}, {name:'Notebook', priceWithTax:275}]
JavaScript

🔍 解説:

  • {} は JavaScript では「関数の本体」とも解釈される。
  • map のアロー関数でオブジェクトリテラルを返すときは、
    丸括弧 ( ) で囲む 必要がある。

実験 3:元の配列を直接変更してしまう(副作用)(問題B)

map は「新しい配列を作る」のが目的なのに、元を壊してしまうパターン。

let items = [{name: 'Pen', price: 100}, {name: 'Notebook', price: 250}];

// ❌ 間違いパターン:元のオブジェクトを直接書き換え
let withSideEffect = items.map(item => {
  item.price = item.price * 1.1; // 元配列を変更してしまう
  return item;
});

console.log('新しい配列:', withSideEffect);
console.log('元の配列:', items);
// 両方の price が110%された状態になってしまう!

// ✅ 正しいパターン:新しいオブジェクトを作る
let pureMap = items.map(item => ({
  name: item.name,
  priceWithTax: item.price * 1.1
}));

console.log('新しい配列:', pureMap);
console.log('元の配列(変更なし):', items);
JavaScript

🔍 解説:

  • map の中で元のオブジェクトを変更すると、元の配列も変わる
  • これは「副作用(side effect)」と呼ばれ、後の処理でバグの原因になる。
  • map は「新しい値を返す」ためのメソッドなので、新しいオブジェクトを返すように書くのがベスト。

実験 4:forEach との混同(問題C)

forEach新しい配列を返さない(戻り値が undefined)ので注意。

let nums = [3, 7, 11];

// ❌ 間違いパターン:forEach で新配列を作ろうとしている
let wrong = nums.forEach(x => `${x}^2 = ${x * x}`);
console.log('結果(間違い):', wrong);
// => undefined

// ✅ 正しいパターン:map なら新しい配列を返す
let correct = nums.map(x => `${x}^2 = ${x * x}`);
console.log('結果(正しい):', correct);
// => ["3^2 = 9", "7^2 = 49", "11^2 = 121"]
JavaScript

🔍 解説:

  • forEach は「繰り返すだけ」で、戻り値は常に undefined
  • map は「処理して return した値を集める」。
  • 「配列を作りたいとき」は map、「処理だけしたいとき」は forEach

まとめ

ミスの種類症状修正方法
return を忘れる[undefined, undefined, ...]return を書く
{} でオブジェクト返却undefined( ) でオブジェクトを囲む
元配列を変更元データも変わる新しいオブジェクトを返す
forEach 使用戻り値が undefinedmap を使う

💡 ワンポイント実践:
もしブラウザで動かすなら、これらの実験コードをそのまま
Chromeの「開発者ツール > Console」に貼って実行してみましょう。
console.log で処理の流れが見えるので、map の仕組みがよくわかります。

タイトルとURLをコピーしました