使用delete删除数组索引后,如何统计JavaScript数组的实际元素数?
获取使用
delete删除数组元素后的实际元素数量 嘿,我完全懂你的需求——用delete arr[index]保留数组索引结构确实很贴合场景,但恼人的是数组length根本不跟着变对吧?这就给你几个实用的办法来拿到实际的元素数量:
方法一:用Object.keys()直接获取有效索引的数量
因为delete操作其实是把对应索引的属性从数组对象中移除了,而Object.keys(arr)会返回数组中所有存在的可枚举索引(也就是那些没被delete掉的位置),所以直接取这个结果的长度就可以:
const arr = [1, 2, 3, 4]; delete arr[1]; const actualLength = Object.keys(arr).length; console.log(actualLength); // 输出 3
方法二:用filter结合Object.hasOwn精准过滤
如果你的数组里可能存在undefined值(不是被delete出的空槽),那用filter直接判断值是否为undefined会误判。这时候可以用Object.hasOwn(arr, index)来检查该索引是否真的存在于数组对象中:
const arr = [1, undefined, 3, 4]; delete arr[2]; const actualLength = arr.filter((_, index) => Object.hasOwn(arr, index)).length; console.log(actualLength); // 输出 3(排除了被delete的索引2,保留了值为undefined的索引1)
方法三:用reduce手动计数
如果你想更灵活地控制计数逻辑,reduce也是个不错的选择:
const arr = [10, 20, 30]; delete arr[0]; const actualLength = arr.reduce((count, _, idx) => { return Object.hasOwn(arr, idx) ? count + 1 : count; }, 0); console.log(actualLength); // 输出 2
补充说明
为啥delete之后length不变?因为数组的length属性本质是由最大的索引值 + 1决定的,delete只是移除了对应索引的元素,并没有改变数组的最大索引,所以length会保持原来的数值。
内容的提问来源于stack exchange,提问作者Willy David Jr
相关产品推荐
相关产品推荐

