JavaScript | ES6+ 文法:分割代入 – 一部要素のスキップ

JavaScript
スポンサーリンク

一部要素のスキップとは何か

配列の分割代入では、左側のパターンにカンマだけを書いて「その位置の要素を受け取らない」ことができます。ここが重要です:スキップは“要素の位置”で意味を表すので、読み手が「どこを使ってどこを捨てるか」を一目で理解できます。必要な要素だけを変数に取り、不要な要素は飛ばすことで、コードが短く明確になります。

const arr = [10, 20, 30];
const [first, , third] = arr;
console.log(first, third); // 10 30(20はスキップ)
JavaScript

基本構文と読みやすいスキップの書き方

スキップは空の位置を「,」で表します。先頭や途中、末尾でも使えます。ここが重要です:カンマの数が“スキップする要素数”を示します。スキップの意図を見せるため、変数名は“意味のある名前”を付け、不要な位置ははっきり空けます。

const [a] = [10, 20];          // 10(残りは無視)
const [, b] = [10, 20];        // 20(先頭をスキップ)
const [a, , c] = [10, 20, 30]; // 10 30(真ん中をスキップ)
const [, , last] = [10, 20, 30]; // 30(先頭2つスキップ)
JavaScript

連続スキップと末尾の扱い

連続した複数要素をまとめて飛ばすには、カンマを続けます。末尾の要素を使わないときに余分な変数を作らないのがポイントです。ここが重要です:右側配列が短い場合、足りない位置は undefined になります。必要なら後述の既定値で守ります。

const arr = [1, 2, 3, 4, 5];
const [first, , , fourth] = arr;
console.log(first, fourth); // 1 4

const [, , , , fifth] = [1, 2, 3]; // fifth は undefined(不足)
JavaScript

既定値との併用(不足や undefined に強くする)

スキップしながら、受け取る位置に既定値を付けられます。ここが重要です:既定値は undefined のときだけ発動し、null には効きません。右側配列が短い場合に備えて、意味のある既定値を添えると安全です。

const [first = 0, , third = 0] = [10]; // first=10, third=0(不足に既定値)
const [, x = "N/A"] = [];               // x="N/A"
const [, y = "N/A"] = [null];           // y=null(既定値は発動しない)
JavaScript

残余要素(…rest)とスキップの組み合わせ

先頭や特定位置だけを取り、それ以外の「残り全部」を配列で受け取れます。ここが重要です:スキップで不要を飛ばし、残余で可変長の部分をまとめると柔軟性が高まります。残余は最後に一つだけ置けます。

const [head, , ...tail] = [10, 20, 30, 40];
console.log(head); // 10
console.log(tail); // [30, 40](20はスキップ)
JavaScript

ネストした配列でのスキップ(階層に沿って飛ばす)

入れ子の配列でも、各階層の位置でスキップできます。ここが重要です:形(パターン)を左側で正しく表すと、必要な値だけを自然に取り出せます。欠ける可能性がある入れ子には、内側に =[] などの既定値を置くと安全です。

const point = [10, [20, 30, 40]];
const [x, [y, , z]] = point; // 内側配列の真ん中をスキップ
console.log(x, y, z); // 10 20 40

const sparse = [10]; // 内側が無いケース
const [a, [b = 0, , c = 0] = []] = sparse;
console.log(a, b, c); // 10 0 0
JavaScript

関数引数でのスキップ(シグネチャに意図を出す)

関数のパラメータに分割代入を使うと、使う位置と捨てる位置が“宣言”に現れます。ここが重要です:引数そのものが未指定でも安全に動くよう、外側の [] 既定値を必ず付けます。読みやすさのため、意味のある位置だけ変数名を付け、不要はスキップします。

function handleRow([id = 0, , price = 0] = []) {
  return `${id} (${Math.round(price * 1.1)}円)`;
}
console.log(handleRow([1, "Apple", 200])); // "1 (220円)"
console.log(handleRow()); // "0 (0円)"
JavaScript

よくある落とし穴と回避策(重要ポイントの深掘り)

スキップは値を受け取らないだけで、右側配列の評価は行われます。重い処理結果を無駄に計算しないよう、そもそも渡す前に必要な要素だけを用意する設計が望ましいです。右側が不足して undefined になると、後続のメソッド呼び出し(undefined.trim() など)でエラーになるため、既定値を付けるか使用前にガードしてください。多用しすぎると「位置と意味の対応」が分かりづらくなる場合があります。位置よりも意味が重要なデータ構造では、オブジェクトの分割代入へ切り替えるほうが可読性が高くなります。

// オブジェクトで“意味ベース”に切り替え
const row = { id: 1, name: "Apple", price: 200 };
const { id, price } = row; // 位置ではなく名前で取り出す
JavaScript

例題で理解を固める

// 1) ログ整形:先頭と末尾だけ使い、途中をスキップ
const log = ([first = "N/A", , third = "N/A"] = []) => `first=${first}, third=${third}`;
console.log(log(["A", "B", "C"])); // first=A, third=C
console.log(log(["A"]));           // first=A, third=N/A

// 2) イベント処理:タイプと残り(payload)を受け、不要な第2要素をスキップ
const handleEvent = ([type = "unknown", , ...payloads] = []) =>
  `type=${type}, payloads=${payloads.length}`;
console.log(handleEvent(["click", "meta", { id: 1 }, { x: 10 }]));

// 3) ネスト配列:Y をスキップして X/Z を取得
const coords = [100, [200, 300, 400]];
const [X, [, , Z]] = coords;
console.log(X, Z); // 100 400

// 4) 既定値併用:不足に強いスキップ
const safe = ([id = 0, , price = 0] = []) => `${id}:${price}`;
console.log(safe([2]));    // 2:0
console.log(safe());       // 0:0

// 5) 配列×残余:最初の要素だけ使い、真ん中をスキップして残り全部受ける
const takeHeadTail = ([head, , ...tail] = []) => ({ head, tail });
console.log(takeHeadTail([1, 2, 3, 4])); // { head: 1, tail: [3, 4] }
JavaScript

まとめ

一部要素のスキップの核心は「位置ベースで必要な値だけ変数に取り、不要な位置はカンマで明確に飛ばす」ことです。不足や undefined に備えて既定値を併用し、残余で可変長の部分をまとめる。ネストでは階層ごとのスキップと既定値で安全に取り出す。位置と意味の対応が複雑になるなら、オブジェクト分割へ切り替える判断が可読性を守ります。これを押さえれば、初心者でも配列データを短く安全に扱えるようになります。

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