Skip to content

稀疏数组

什么是稀疏数组

数组中某些索引没有分配值的数组称为稀疏数组。稀疏数组的长度大于其元素的个数。

稀疏数组与密集数组的区别

稀疏数组的一个特点是数组的某些索引没有分配值,因此即使数组的每个索引都被复制为 nullundefined,这个数组严格意义上也不是稀疏数组。

ts
const sparseArr = [1, , , 4];
const denseArr = [1, undefined, undefined, 4];

console.log(sparseArr); // [ 1, <2 empty items>, 4 ]
console.log(denseArr); // [ 1, undefined, undefined, 4 ]

console.log(sparseArr.length); // 4
console.log(denseArr.length); // 4

console.log(JSON.stringify(sparseArr)); // [1,null,null,4]
console.log(JSON.stringify(denseArr)); // [1,null,null,4]

console.log(3 in sparseArr); // false
console.log(3 in denseArr); // true

创建稀疏数组

创建稀疏数组的常用方法是给数组的高位索引赋值。

稀疏数组的 length 属性计算方式是数组中最大索引值加一,因此稀疏数组中的实际元素个数会小于数组的长度。

ts
const createSparseArr = [];
createSparseArr[3] = 3;

console.log(createSparseArr); // [ <3 empty items>, 3 ]
console.log(createSparseArr.length); // 4
console.log(JSON.stringify(createSparseArr)); // [null,null,null,3]

检查稀疏数组

可以使用 in 或者 hasOwnProperty 方法来检查稀疏数组中的索引是否存在。

ts
const checkSparseArr = new Array(3);
checkSparseArr[3] = 3;

console.log(0 in checkSparseArr); // false
console.log(checkSparseArr.hasOwnProperty(0)); // false

遍历稀疏数组

for...inforEach 循环会跳过稀疏数组中的空位,而简单 for 循环和 for...of 循环不会。

ts
const iterateSparseArr = [];
iterateSparseArr[3] = "a";

for (const key in iterateSparseArr) {
  console.log(iterateSparseArr[key]); // a
}

iterateSparseArr.forEach((item) => {
  console.log(item); // a
});

for (const item of iterateSparseArr) {
  console.log(item); // undefined undefined undefined a
}

for (let i = 0; i < iterateSparseArr.length; i++) {
  console.log(iterateSparseArr[i]); // undefined undefined undefined a
}