いままでのブログで何度か配列について書きました。
今回は、ちょっと変わったスパース配列(sparse array)についてご紹介します。

スパース配列とは?
配列の長さ(length)に対して、実際に値が入っている要素の数が少ない配列を、
まばらな配列=スパース配列と呼びます。
それに対して、
配列の長さと同じ数の要素をすべて持つ、いわば「通常の」配列は
密な配列 (dense array) と呼ばれることがあります。
コード例
let items = [ ];
items.push(“A”);
items.push(“B”);
items[5] = “F”;
items.splice(1, 1);
※インデックスを飛ばして代入したため、途中に empty が生まれています。
この配列をそのまま出力すると、
console.log(items);
// [“A”, empty ×3, “F”] と表示されます。
emptyとundefinedの違い
ここが スパース配列で一番混乱しやすいポイント です。
console.log(items[2]); // undefined
- empty
→ そのインデックス自体が存在しない(未割り当て) - undefined
→ 要素は存在するが、値が未定義(undefined)
つまり、
「empty は undefined が入っているわけではない」
という点が重要です。
ただし、存在しないスロットの値を取得しようとすると
結果として undefined が返るため、見た目上は区別がつきにくくなっています。
スパース配列のデメリット
① 配列メソッドが「空」をスキップする
例えば、配列の要素を順番に処理したいときに forEach() を使うと、
items.forEach(item => {
console.log(item);
});
empty の要素は処理されません。
・forEach
・map
・filter
これらのメソッドは 「存在する要素」だけを対象 にします。
そのため、
「10回分処理したいつもりが、実際には回らない」
といったバグの原因になりやすいです。
② length は大きいのに中身が少ない
console.log(items.length); // 6
length は 最大インデックス + 1 になるため、
中身がスカスカでも配列が大きく見えてしまいます。
まとめ
・スパース配列は 「要素が存在しない index を含む配列」
・配列メソッドは empty をスキップする
・意図せず作るとバグの原因になりやすい
あまり馴染みはないですが、こういう配列もあることを知っておくだけでもよいと思います。
・JavaScript入門 JavaScriptの疎らな配列
https://javascript.keicode.com/lang/array-sparse.php
2026年2月16日アクセス時点
・面白法人カヤック 【JS体操第3問ヒント③】「疎」な配列を「密」にする12の方法
2026年2月16日アクセス時点
