JavaScript 深度清理对象与数组中的 null、undefined 及空值方法

作者:小括号时间:2026-10-22 19:12:16浏览:551

本文介绍了一种 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;
 }

总结

以上就是本文的全部内容,希望这些内容对大家的编程学习或工作有所帮助。如有疑问欢迎留言交流,感谢支持。

作者最新文章