2012-02-25 3 views
3

я сначала получить ответ AJAX из {"B":{"1":"100","3":{"AA":256}},"A":100} и преобразуется в JavaScript Object:Как вы рекурсивно удаляете вложенные объекты, содержащие пустой массив?

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

Будущие ответы могут быть подмножествами или надмножествами исходного ответа. Если значение таблицы остается неизменным на сервере, застоявшиеся данные заменяются пустым массивом. Пример:

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

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

Каждый раз, когда ответное АЯКС получен, объект обновляется с:

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

Но мне нужен JavaScript Object, чтобы сохранить неизменными части, так что я необходимо довести до объекта, который будет эквивалентен следующему с приведенными выше примерами ответов:

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

Моим предпочтительным вариантом было бы удалить пустые объекты из преобразованного ответа. Есть ли существующая функция или модификация функции расширения jQuery, которая бы это сделала?

ответ

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/

+0

Я вижу ваше определение, но когда бы метод не существует? – shaun5

+0

@ shaun5 - У старых браузеров нет 'Array.isArray()', поэтому мы уверены, что он определен даже для них, не заменяя его, если он уже существует. – jfriend00

+0

@ shaun5 - Добавлен рабочий jsFiddle: http://jsfiddle.net/jfriend00/U6qMH/ – jfriend00

0

Не совсем то, что я просил, но удаление пустых массивов из строки JSON решение:

jQuery.extend(true, jsonOBJ, jQuery.parseJSON(data.replace(/"[A-Za-z0-9_]*":\[\]/,'').replace(/{,/,'{').replace(/,}/,'}'))); 
Смежные вопросы