如何递归删除包含空数组的嵌套对象?
我最初收到{"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(/,}/,'}')));