如何区分未定义的数组元素和空槽?

时间:2016-11-22 22:01:02

标签: javascript arrays undefined

假设我是一名用户脚本开发人员,而且我无法控制页面上的javascript。该页面创建具有随机长度的数组,用随机值填充它们(包括虚假值,例如undefined)。并非每个元素都必须赋值,因此可能会有空插槽。

简化示例(Firefox控制台):

var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;
console.log(arr);               \\ Array [ null, undefined, <1 empty slot> ]
console.log(arr[1]);            \\ undefined
console.log(arr[2]);            \\ undefined
console.log(arr[1] === arr[2]); \\ true
console.log(typeof arr[1]);     \\ undefined
console.log(typeof arr[2]);     \\ undefined

正如我们所看到的,Firefox以不同方式显示undefined和空插槽,而对于javascript,它们似乎相同。

现在假设我要清理这样一个数组,删除所有空插槽但保留undefined个元素。我该怎么做?

2 个答案:

答案 0 :(得分:19)

您可以使用in运算符检查阵列是否有密钥。对于空插槽,它将返回false,但对于包含值undefined

的值的插槽,则为true
var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;

1 in arr; // true
2 in arr; // false

请注意,您不能使用它来区分数组末尾的空插槽和插槽,但如果您知道数组的长度,那么您已经知道3不是&#39;部分内容,因此您无需测试3 in arr

你也可以过滤出这样的空位:

arr = arr.filter( function ( _, i ) { return i in arr } );

答案 1 :(得分:3)

您可以使用Array#forEach,它会省略稀疏元素。

&#13;
&#13;
var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;
console.log(arr); 

var withoutSparse = [];

arr.forEach(function (a, i) {
    console.log(i);
    withoutSparse.push(a);
});
console.log(withoutSparse);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;