这两天在项目中遇到后台需要传的数据为不能有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、空对象、空数组方法的更多相关文章

  1. JS数组常用函数以及查找数组中是否有重复元素的三种常用方法

    阅读目录: DS01:常用的查找数组中是否有重复元素的三种方法 DS02:常用的JS函数集锦 DS01.常用的查找数组中是否有重复元素的三种方法  1. var ary = new Array(&qu ...

  2. 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

    指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...

  4. JS删除数组中某一项或几项的方法汇总

    1.JS中的splice方法 splice(index, len, [item])    //注意:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值. ...

  5. 区分js中的null,undefined,"",0和false

    console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof " ...

  6. js中,null, '',undefined的区别

    在js中有三种值都可以代表false  "",null,undefined 那么他们之间到底有什么区别呢 首先我们先看这三种值得类型 ""代表了一个没有字符的字 ...

  7. js实现往数组中添加非存在的对象,如果存在就改变键值。

    let arr = [] // 数组中元素数据类型为{name: 'bb', age: 12} // 现在需求是,将每次获得的新对象{name: '', age: }push到数组arr中,但前提是数 ...

  8. js 数组 添加或删除 元素 splice 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 filter

    里面可以用 箭头函数 splice         删除 增加 数组 中元素 操作数组 filter 创建新数组  检查指定数组中符合条件的所有元素

  9. js中 null, undefined, 0,空字符串,false,不全等比较

    null == undefined // true null == ''  // false null == 0 // false null == false // false undefined = ...

随机推荐

  1. python爬虫urllib库使用

    urllib包括以下四个模块: 1.request:基本的HTTP请求模块,可以用来模拟发送请求.就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程. ...

  2. win7 设置docker加速器

    本来专门已经有了一个源于docker加速器的了,公司的电脑是mac,配置很简单,但是我自己的电脑是win7,在实际操作的时候还真是累啊,官网的教程不知道为什么没起效果,所以最终还是找了其他人发的帖,可 ...

  3. 动手玩转Docker(一)

    在学习docker之前,先了解一下什么是docker,以及docker技术存在的意义. Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上 ...

  4. CGLIB动态代理模式

    概念: 第三方技术CGLIB动态代理和JDK代理不同的是,JDK代理需要提供接口,而CGLIB代理不需要: 它只需要一个非抽象类就能实现动态代理 例子: /** * 非抽象类 * @author Ad ...

  5. CDH集群安装配置(一)-集群规划和NAT网络配置

    三台物理机或者虚拟机. cdh1,cdh2,cdh3. 内存要求大于8GB,cdh1的物理磁盘要求多余50G. 每台虚拟机安装centos 7 系统.

  6. SVM面经

    原始问题与对偶问题的关系 1,目标函数对原始问题是极大化,对对偶问题则是极小化 2,原始问题目标函数中的收益系数(优化函数中变量前面的系数)是对偶问题约束不等式中的右端常数,而原始问题约束不等式中的右 ...

  7. (转)MySQL Proxy使用

    转自: http://www.cnblogs.com/itech/archive/2011/09/22/2185365.html http://koda.iteye.com/blog/788862 h ...

  8. 【CSS】 一个简单的导航条

    今天来做一个导航条! 首先写一个坯子: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &quo ...

  9. C#中加粗label的字体

    1. 在C#的代码中想直接加粗label控件的字体, label1.Font.Bold = true;//发现系统会提示Font.Bold是只读属性 如果必须要加粗字体呢,方法如下: 2. 使用Fon ...

  10. 九度oj题目1555:重复子串

    题目1555:重复子串 时间限制:3 秒 内存限制:256 兆 特殊判题:否 提交:738 解决:125 题目描述: 给定一个由小写字母组成的字符串,求它的所有连续子串中,出现过至少两次,且至少有一对 ...