2012-02-25 21 views
3

Iは、最初{"B":{"1":"100","3":{"AA":256}},"A":100}のAJAXの応答を受信するとJavaScriptオブジェクトに変換:空の配列を含む入れ子になったオブジェクトを再帰的に削除する方法はありますか?

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

将来の応答は、初期応答のサブセット又はスーパーセットであることができます。テーブルの値がサーバで変更されていない場合、停滞データは空の配列に置き換えられます。例:毎回AJAXの応答を受信する

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

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

、オブジェクトがで更新されます。

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

しかし、私は変わらない部分を維持するためにはJavaScriptオブジェクトが必要なので、I上の例の応答では、次のようなオブジェクトで終わる必要があります。

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(/,}/,'}'))); 
関連する問題