如何递归删除包含空数组的嵌套对象?

时间:2012-02-25 17:51:37

标签: javascript jquery recursion

我最初收到{"B":{"1":"100","3":{"AA":256}},"A":100}的AJAX响应并转换为javascript对象:

var jsonOBJ = {};
jsonOBJ = jQuery.parseJSON(data);

未来的响应可以是初始响应的子集或超集。如果服务器上的表值未更改,则停滞数据将替换为空数组。例如:

{"B":{"1":"90","2":200,"3":[]}}

{"B":[],"A":20}

每次收到AJAX响应时,对象都会更新为:

jQuery.extend(true, jsonOBJ, jQuery.parseJSON(data));

但是我需要javascript对象来保持未更改的部分,所以我需要最终得到一个与上面的示例响应相同的对象:

jsonOBJ = jQuery.parseJSON('{"B":{"1":"90","2":200,"3":{"AA":256}},"A":20}');

我首选的选项是从转换​​后的响应中删除空对象。是否有一个现有的函数或对jQuery扩展函数的修改可以做到这一点?

3 个答案:

答案 0 :(得分:5)

您可以使用此代码删除响应中包含空数组的元素。

它在顶层循环,寻找任何空数组并删除它们。它找到的任何对象,它都会递归到它们中去除空数组:

// make sure the ES5 Array.isArray() method exists
if(!Array.isArray) {
  Array.isArray = function (arg) {
    return Object.prototype.toString.call(arg) == '[object Array]';
  };
}

function removeEmptyArrays(data) {
    for (var key in data) {
        var item = data[key];
        // see if this item is an array
        if (Array.isArray(item)) {
            // see if the array is empty
            if (item.length == 0) {
                // remove this item from the parent object
                delete data[key];
            }
        // if this item is an object, then recurse into it 
        // to remove empty arrays in it too
        } else if (typeof item == "object") {
            removeEmptyArrays(item);
        }
    }    
}

var jsonOBJ = {};
jsonOBJ = jQuery.parseJSON(data);
removeEmptyArrays(jsonOBJ);

您可以在此处查看:http://jsfiddle.net/jfriend00/U6qMH/

答案 1 :(得分:0)

不是我要求的,但是从JSON字符串中删除空数组是一个解决方案:

jQuery.extend(true, jsonOBJ, jQuery.parseJSON(data.replace(/"[A-Za-z0-9_]*":\[\]/,'').replace(/{,/,'{').replace(/,}/,'}')));

答案 2 :(得分:0)

这将完成功能;)

removeEmptyArrays(data) {
    for (var key in data) {
        var item = data[key];
        // see if this item is an array
        if (Array.isArray(item)) {
          // see if the array is empty
          if (item.length == 0) {
             // remove this item from the parent object
             delete data[key];
           } else {
             this.removeEmptyArrays(item);
           }
        // if this item is an object, then recurse into it 
        // to remove empty arrays in it too
        } else if (typeof item == "object") {
            this.removeEmptyArrays(item);
        }
    }    
},