假设我是一名用户脚本开发人员,而且我无法控制页面上的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
个元素。我该怎么做?
答案 0 :(得分:19)
您可以使用in运算符检查阵列是否有密钥。对于空插槽,它将返回false,但对于包含值undefined
:
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
,它会省略稀疏元素。
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;