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代码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、空对象、空数组方法的更多相关文章
- JS数组常用函数以及查找数组中是否有重复元素的三种常用方法
阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法 1. var ary = new Array(&qu ...
- 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针
指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...
- JS删除数组中某一项或几项的方法汇总
1.JS中的splice方法 splice(index, len, [item]) //注意:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值. ...
- 区分js中的null,undefined,"",0和false
console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof " ...
- js中,null, '',undefined的区别
在js中有三种值都可以代表false "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...
- js实现往数组中添加非存在的对象,如果存在就改变键值。
let arr = [] // 数组中元素数据类型为{name: 'bb', age: 12} // 现在需求是,将每次获得的新对象{name: '', age: }push到数组arr中,但前提是数 ...
- js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter
里面可以用 箭头函数 splice 删除 增加 数组 中元素 操作数组 filter 创建新数组 检查指定数组中符合条件的所有元素
- js中 null, undefined, 0,空字符串,false,不全等比较
null == undefined // true null == '' // false null == 0 // false null == false // false undefined = ...
随机推荐
- 用Javac编译Java文件时出现“编码 GBK 的不可映射字符“的error
前提:JDK版本 >= 1.6会出现编译报错, 1.6前只会是警告 以下是javac的document: 遇到这种情况的原因是: 文件编码格式与编译器编译所选的encoding不同,有非英文字符 ...
- 记新人从 excel 文件中读取字典数据踩的一个坑
原本是打算今天分享一下最近学习接口自动化的心得体会,然而在我写模板的时候,却被一个坑拦我大半天,心得体会不得不 延期再分享了.在我无数次调试无数次看log,终于发现并解决这个问题了.下面记录一下踩的坑 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- Android Studio Gradle下载的包在哪里?
C:\Users\Administrator\.gradle\caches\modules-2\files-2.1
- 使用 json_serializable (flutter packages pub run build_runner build) 问题
命令: flutter packages pub run build_runner build 使用 build_runner 生成 .g.dart 文件 flutter packages pub r ...
- 3.nginx日志
1. 自定义日志格式为json log_format json '{"@timestamp":"$time_iso8601",' '"@version ...
- vue项目里登录界面实现回车登录
全局监听enter键,是把监听事件绑定到document上,无需获取焦点之类的 created() { let that = this; document.onkeydown =function(e) ...
- range() 和 np.arange()区别
range() 和 np.arange()区别 range(start,stop,step) 三个参数都必须是整数 np.arange()没有此类约束
- C# 获取类名
1.获取C#类中类名 System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; 2.获取C#类中类名(包含命名空间) Sy ...
- 关于mouseleave事件触发的bug问题
在做下拉树搜索功能的时候,下方内容框需要一个鼠标移出时就隐藏的功能,于是使用mouseleave的方法, 但是出现了一个问题就是在点击树展开个隐藏的时候,也触发了leave事件,将下方的树进行隐藏,出 ...