2012-02-25 5 views
3

I reçoivent initialement une réponse AJAX de {"B":{"1":"100","3":{"AA":256}},"A":100} et converti en un objet javascript:Comment supprimer récursivement des objets imbriqués contenant un tableau vide?

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

réponses avenir peut être des sous-ensembles ou des sur-ensembles de la première réponse. Si la valeur d'une table est inchangée sur le serveur, les données stagnantes sont remplacées par un tableau vide. Exemple:

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

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

Everytime une réponse AJAX est reçue, l'objet est mis à jour avec:

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

Mais je dois l'objet javascript pour garder les parties inchangées, donc je besoin de se retrouver avec un objet qui serait équivalent à ce qui suit avec les exemples de réponses ci-dessus:

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

Mon option préférée serait de supprimer les objets vides de la réponse convertie. Existe-t-il une fonction existante ou une modification de la fonction d'extension jQuery qui le ferait?

Répondre

5

Vous pouvez supprimer les éléments dans votre réponse avec des tableaux vides avec ce code.

Il parcourt le niveau supérieur, recherchant les matrices vides et les supprimant. Tous les objets qu'il trouve, il récursif en également supprimer des tableaux vides en eux:

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

Vous pouvez le voir travailler ici: http://jsfiddle.net/jfriend00/U6qMH/

+0

Je vois votre définition, mais quand la méthode serait pas exister? – shaun5

+0

@ shaun5 - Les anciens navigateurs n'ont pas 'Array.isArray()' intégré donc nous nous assurons qu'il est défini même pour eux sans le remplacer s'il existe déjà. – jfriend00

+0

@ shaun5 - Ajouté jsFiddle de travail: http://jsfiddle.net/jfriend00/U6qMH/ – jfriend00

0

Pas vraiment ce que j'ai demandé, mais en supprimant les tableaux vides de la chaîne JSON est une solution:

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