いままでのブログで何度か配列について書きました。
今回は、ちょっと変わったスパース配列(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日アクセス時点