本文介绍了一种 JavaScript 方法,用于深度清理包含 null、undefined、空对象及空数组的复杂数据集合。通过递归遍历,该方法能移除无效值并保持数据结构完整,适用于需要向后台传输纯净数据的场景。
背景与需求
在项目开发中,有时需要向后台接口提交数据,要求数据中不能包含 null 或空值。当待处理的数据是一个结构复杂的对象或数组集合时,手动清理变得繁琐。为此,编写了一个通用的处理函数来解决这一问题,该函数旨在兼容各种数据类型,具体实现代码如下:
let obj = {
a: {
a_1: 'qwe',
a_2: undefined,
a_3: function (a, b) {
return a + b;
},
a_4: {
a_4_1: 'qwe',
a_4_2: undefined,
a_4_3: function (a, b) {
return a + b;
},
a_4_4: {
a_4_4_1: undefined,
a_4_4_2: undefined,
a_4_4_3: undefined,
a_4_4_4: {
a_4_4_4_1: undefined,
a_4_4_4_2: undefined,
a_4_4_4_3: undefined,
a_4_4_4_4: undefined,
a_4_4_4_5: undefined,
a_4_4_4_6: undefined
}
}
}
},
b: [{
a_1: 'qwe',
a_2: undefined,
a_3: function (a, b) {
return a + b;
},
a_4: {
a_4_1: 'qwe',
a_4_2: undefined,
a_4_3: function (a, b) {
return a + b;
},
a_4_4: {
a_4_4_1: undefined,
a_4_4_2: undefined,
a_4_4_3: undefined,
a_4_4_4: {
a_4_4_4_1: undefined,
a_4_4_4_2: undefined,
a_4_4_4_3: undefined,
a_4_4_4_4: undefined,
a_4_4_4_5: undefined,
a_4_4_4_6: undefined
}
}
}
}],
c: [{
a: undefined,
b: undefined,
c: undefined,
d: undefined
}, {
a: undefined,
b: undefined,
c: undefined,
d: undefined
}]
};
以下是 JavaScript 部分的实现代码:
核心清理逻辑实现
//判断对象是否没有属性,如{}或者[]
function isEmptyObj(o) { for (let attr in o) return !1; return !0 }
function processArray(arr) {
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] === null || arr[i] === undefined) arr.splice(i, 1);
else if (typeof arr[i] == 'object') removeNullItem(arr[i], arr, i);
}
return arr.length == 0
}
function proccessObject(o) {
for (let attr in o) {
if (o[attr] === null || o[attr] === undefined) delete o[attr];
else if(typeof o[attr]=='object') {
removeNullItem(o[attr]);
if (isEmptyObj(o[attr])) delete o[attr];
}
}
}
function removeNullItem(o,arr,i) {
let s = ({}).toString.call(o);
if (s == '[object Array]') {
if (processArray(o) === true) {//o也是数组,并且删除完子项,从所属数组中删除
if (arr) arr.splice(i, 1);
}
}
else if (s == '[object Object]') {
proccessObject(o);
if (arr&&isEmptyObj(o)) arr.splice(i, 1);
}
}
removeNullItem(obj)
console.log(obj)
如果仅需处理对象中的 null 和 undefined 属性,而希望保留数组中 undefined 或 null 项以维持数组长度,则可以移除 removeNullItem 函数,并调用 processArray 来删除数组项。上述示例中已包含测试数据。

-收缩 JavaScript 代码
数组与对象的递归处理
function processArray(arr) {
for (let i = arr.length - 1; i >= 0; i--) {
/*if (arr[i] === null || arr[i] === undefined) arr.splice(i, 1);
else */if (typeof arr[i] == 'object') removeNullItem(arr[i], arr, i);
}
return arr.length == 0
}
function removeNullItem(o,arr,i) {
let s = ({}).toString.call(o);
if (s == '[object Array]') {
if (processArray(o) === true) {//o也是数组,并且删除完子项,从所属数组中删除
//if (arr) arr.splice(i, 1);
}
}
else if (s == '[object Object]') {
proccessObject(o);
//if (arr&&isEmptyObj(o)) arr.splice(i, 1);
}
}
补充:JavaScript 中判断变量是否为空(null、undefined)、空数组、空对象、空 Object,以及字符串是否为空或仅含空白字符、数字是否为 0、布尔值是否为 false 的方法。由于 Object 没有 length 属性,
可以使用 Object.keys() 来判断。该方法适用于数组(注意 IE8 不支持此属性)和对象,返回由可枚举实例属性名组成的数组,从而判断对象是否为空。
利用逻辑或运算符(||)的特性,只要有一项为真则不再计算后续表达式,从而实现无论传入何种类型的参数都能统一处理。只要符合对“空”的定义,即返回 true。
空值判断辅助函数
function IsNothing(e) {
var isNt = e === 0 || e === false || e === null || e === undefined || Object.keys(e).length === 0 || /^\s*$/gim.test(e.toString());
return isNt;
}
总结
以上就是本文的全部内容,希望这些内容对大家的编程学习或工作有所帮助。如有疑问欢迎留言交流,感谢支持。