JavaScript对象数组按索引删除仅能移除非空对象,无法删除空对象如何修复
问题原因排查
你提供的deleteItem函数本身逻辑是正常的,Array.splice方法不会区分删除目标是空对象还是非空对象,只要传入的索引正确,对应位置的元素都会被删除。出现空对象删不掉的情况,几乎都是调用删除函数时传入的索引有误,最常见的场景是正序遍历数组找空对象删除时,没有处理删除元素后数组长度变化、后续元素索引前移导致的偏移问题。
举个常见的错误调用示例:
// 错误调用:正序遍历删除空对象,会出现遗漏 for (let i = 0; i < array.length; i++) { // 判断是否为空对象 if (Object.keys(array[i]).length === 0) { deleteItem(i) } }
以上代码遇到连续空对象时,删除第一个空对象后,后续元素索引全部前移一位,循环计数+1就会跳过下一个元素,导致部分空对象没被删除。
修复方案
方案1:调整遍历顺序为倒序
倒序遍历时删除元素,不会影响还未遍历的前半部分元素的索引,不会出现遗漏:
// 倒序遍历删除空对象 for (let i = array.length - 1; i >= 0; i--) { if (Object.keys(array[i]).length === 0) { deleteItem(i) } }
方案2:直接用filter过滤空对象(更简洁)
不需要手动遍历调用删除函数,直接过滤生成新数组即可:
// 过滤掉所有空对象 array = array.filter(item => Object.keys(item).length !== 0)
验证说明
如果直接传入空对象的正确索引调用deleteItem,是可以正常删除的,比如示例里的空对象在索引3的位置:
deleteItem(3) console.log(array.length) // 输出3,空对象已被删除
内容的提问来源于stack exchange,提问作者sam1024
相关产品推荐
相关产品推荐

