使用jQuery删除JSON数组元素后如何避免出现null值?
解决数组删除元素后出现null的问题
这问题我之前踩过坑!用delete操作数组元素确实会留下空位,因为它本质上是删除对象的属性(数组也是特殊的对象),并不会改变数组的长度,所以那个被删的位置就变成了空位,后续处理时会显示为null。给你几个实用的解决办法:
方法一:使用filter()(最推荐,简洁直观)
filter()会创建一个新数组,只包含符合条件的元素,直接过滤掉你想删除的项,完全不会留下空位:
var json_obj = [{"id":"7","a_id":0,"cost":"Real Cost","desc":"this a value","minage":0,"maxage":""}, {"id":"10","a_id":0,"cost":"Real Cost","desc":"other","minage":0,"maxage":""}, {"id":"13","a_id":0,"cost":"Real Cost","desc":"other","minage":0,"maxage":""}]; // 过滤掉id为"13"的元素(注意原数据id是字符串类型,要匹配一致) json_obj = json_obj.filter(item => item.id !== "13");
执行后json_obj就是干净的数组:
[{"id":"7","a_id":0,"cost":"Real Cost","desc":"this a value","minage":0,"maxage":""}, {"id":"10","a_id":0,"cost":"Real Cost","desc":"other","minage":0,"maxage":""}]
方法二:使用splice()(直接修改原数组)
如果你需要在原数组上直接修改,先找到目标元素的索引,再用splice()删除(注意要倒序遍历,避免因数组长度变化跳过元素):
var json_obj = [{"id":"7","a_id":0,"cost":"Real Cost","desc":"this a value","minage":0,"maxage":""}, {"id":"10","a_id":0,"cost":"Real Cost","desc":"other","minage":0,"maxage":""}, {"id":"13","a_id":0,"cost":"Real Cost","desc":"other","minage":0,"maxage":""}]; // 倒序遍历数组 for (let i = json_obj.length - 1; i >= 0; i--) { if (json_obj[i].id === "13") { json_obj.splice(i, 1); // 从索引i处删除1个元素 break; // 如果只有一个id=13的元素,找到后直接退出循环即可 } }
这样原数组就会直接被修改,不会留下null。
为什么原来的方法会出现null?
delete json_obj[i]只是删除了数组对象的第i个属性,数组的length属性并不会改变,所以数组的第三个位置会变成一个“空位”。当你序列化或者遍历这个数组时,空位就会被显示为null,这就是问题的根源。
内容的提问来源于stack exchange,提问作者roche




