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 = ...
随机推荐
- python爬虫urllib库使用
urllib包括以下四个模块: 1.request:基本的HTTP请求模块,可以用来模拟发送请求.就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程. ...
- win7 设置docker加速器
本来专门已经有了一个源于docker加速器的了,公司的电脑是mac,配置很简单,但是我自己的电脑是win7,在实际操作的时候还真是累啊,官网的教程不知道为什么没起效果,所以最终还是找了其他人发的帖,可 ...
- 动手玩转Docker(一)
在学习docker之前,先了解一下什么是docker,以及docker技术存在的意义. Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上 ...
- CGLIB动态代理模式
概念: 第三方技术CGLIB动态代理和JDK代理不同的是,JDK代理需要提供接口,而CGLIB代理不需要: 它只需要一个非抽象类就能实现动态代理 例子: /** * 非抽象类 * @author Ad ...
- CDH集群安装配置(一)-集群规划和NAT网络配置
三台物理机或者虚拟机. cdh1,cdh2,cdh3. 内存要求大于8GB,cdh1的物理磁盘要求多余50G. 每台虚拟机安装centos 7 系统.
- SVM面经
原始问题与对偶问题的关系 1,目标函数对原始问题是极大化,对对偶问题则是极小化 2,原始问题目标函数中的收益系数(优化函数中变量前面的系数)是对偶问题约束不等式中的右端常数,而原始问题约束不等式中的右 ...
- (转)MySQL Proxy使用
转自: http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html http://koda.iteye.com/blog/788862 h ...
- 【CSS】 一个简单的导航条
今天来做一个导航条! 首先写一个坯子: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &quo ...
- C#中加粗label的字体
1. 在C#的代码中想直接加粗label控件的字体, label1.Font.Bold = true;//发现系统会提示Font.Bold是只读属性 如果必须要加粗字体呢,方法如下: 2. 使用Fon ...
- 九度oj题目1555:重复子串
题目1555:重复子串 时间限制:3 秒 内存限制:256 兆 特殊判题:否 提交:738 解决:125 题目描述: 给定一个由小写字母组成的字符串,求它的所有连续子串中,出现过至少两次,且至少有一对 ...