如何移除JavaScript数组中values子数组全为空value的对象?
过滤数组中所有values的value均为空的对象
你的代码逻辑出错的根源在于count的初始值设置错误,导致无法正确判断某个对象的所有value是否为空。让我一步步帮你解决这个问题:
问题分析
你初始化count = 1,每遇到一个空value就给count加1。比如第一个对象的values长度是2,两个value都是空,此时count会变成1+2=3,而dataValueLength是2,2 == 3不成立,所以不会执行splice移除该对象——这就是代码失效的核心原因。
解决方案1:修正你的循环代码
只需要把count的初始值改为0,然后判断空值的数量是否等于values的长度即可:
var data = [ { "field": "surname", "values": [ { "id": "drivingLicenseFront", "value": "", "isAvailable": true }, { "id": "passport", "value": "", "isAvailable": true } ], "status": "passed" }, { "field": "given names", "values": [ { "id": "drivingLicenseFront", "value": "", "isAvailable": true }, { "id": "passport", "value": "", "isAvailable": true } ], "status": "passed" }, { "field": "date of birth", "values": [ { "id": "drivingLicenseFront", "value": "25.07.1974", "isAvailable": true }, { "id": "passport", "value": "05 JUN /JOIN 57", "isAvailable": true } ], "status": "passed" } ]; for (let x = data.length-1; x >= 0; x--) { let count = 0; // 初始值改为0 const dataValueLength = data[x].values.length; for (let y = 0; y < dataValueLength; y++) { if (data[x].values[y].value === "") { count++; } } if (count === dataValueLength) { // 空值数量等于values长度时移除 data.splice(x, 1) } } console.log(JSON.stringify(data));
解决方案2:用更简洁的数组方法(推荐)
JavaScript的数组方法filter结合every或some可以让代码更简洁易读,而且不会直接修改原数组(如果需要修改原数组,直接赋值即可):
使用every判断所有value是否为空
const filteredData = data.filter(item => { // 保留那些不是所有value都为空的对象 return !item.values.every(valObj => valObj.value === ""); });
使用some判断是否存在非空value
const filteredData = data.filter(item => { // 保留那些至少有一个value不为空的对象 return item.values.some(valObj => valObj.value !== ""); });
这两种写法都能得到你想要的结果:仅保留"date of birth"对应的对象。
内容的提问来源于stack exchange,提问作者CodeHunter
相关产品推荐
相关产品推荐

