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

我最初收到{"B":{"1":"100","3":{"AA":256}},"A":100}的AJAX响应{"B":{"1":"100","3":{"AA":256}},"A":100}并转换为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扩展函数的修改可以做到这一点?

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

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

 // 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/

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

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