2016-03-28 21 views
0

次のデータを含むJSONがあります.JavaScriptで処理すると、各要素を調べて、NULLであれば削除しますそれが配列の場合、私はサブ配列をループし、その中のnull要素を見つけて削除したかったのです。次のコードを試しましたが、要素が配列内の配列であるかどうかを認識できませんでした。配列の要素が配列かどうかを確認するjavacript/jquery

CODE:

  for (var key in data) { 

       if (!data[key]) { 
        delete data[key]; 
       }else if(data.key && data.key.constructor === Array){ 
         var subArray = data[key]; 
         for(var subKey in subArray){ 
          if (!data[key]) 
          delete subArray[subKey]; 
        } 
       } 

      } 

JSON:

{ 
    confirmDate : "2016-03-27T23:24:36.338Z", 
    earliestPossibleInhandDate : "2016-03-28T23:24:36.338Z", 
    eventStartTime : null, 
    lastChanceDate : null, 
    latestPossibleInhandDate : null, 
    metas : Array[1], 
    onSaleDate : "2016-03-28T23:24:41.461Z" 
    primaryCategoryId : "114", 
    secondaryGroupings : Array[2], 
    status : "active" 
} 

EDIT:修正JSON

{ 
    "secondaryGroupings": [{ 
     "groupingId": "720072", 
     "status": "active" 
    }, { 
     "groupingId": null, 
     "status": null 
    }], 
    "secondaryPerformers": [{ 
     "status": null 
    }], 
    "metas": [{}], 
    "status": "active", 
    "primaryCategoryId": "7667", 
    "eventStartTime": null, 
    "lastChanceDate": null, 
    "onSaleDate": "2016-03-29T00:25:56.670Z", 
    "confirmDate": "2016-03-28T00:25:56.670Z", 
    "earliestPossibleInhandDate": "2016-03-29T00:25:56.670Z", 
    "latestPossibleInhandDate": null 
} 
+0

そのJSONは何ですか?あなたはそれを検証しようとしましたか?私はコンマが見えず、配列の構文も間違っています。 http://jsonlint.com/ –

+0

これは単なるJSONサンプルです。クロムコンソールからコピーしました:) – user1614862

+0

JSONの解析に本当の助けが必要な場合は、有効なJSONを教えてください。 – MattSizzle

答えて

0
for (var key in data) { 
    // you are deleting all the null values 
    if (!data[key]) { 
     delete data[key]; 
    } 
    // here key is a variable so you must access key as data[key] with bracket notation 
    // also the first check here is a bit redundant as you already deleted the null values 
    else if(data.key && data.key.constructor === Array){ 
      var subArray = data[key]; 
      // you can go over arrays like this but it is better to do a normal for loop or use Array.prototype.forEach because an array is not a key value store 
      for(var subKey in subArray){ 
       if (!data[key]) 
       delete subArray[subKey]; 
     } 
    } 
} 

// something like this.. 
for (var key in data) { 
    if (!data[key]) { 
     delete data[key]; 
    } 
    if (data[key].constructor === Array){ 
     var subArray = data[key]; 
     subArray.forEach(function(item) { 
     // I am not sure what your inner array looks like is it an array of objects? 
      // do stuff with each item 
     }) 
    } 
} 

// this works for your dataset but it ain't pretty 
function stripData(data) { 
    if (Array.isArray(data)){ 
    data.forEach(function(item) { 
     stripData(item); 
    }) 
    return data.filter(function(item) { 
     return Object.keys(item).length > 0; 
    }) 
    } else if (typeof data === 'object') { 
    for (key in data) { 
     if (data[key] === null || data[key].length === 0) delete data[key]; 
     else data[key] = stripData(data[key]); 
    } 
    return data; 
    } 
    for (key in data) { 
    if (data[key].length === 0) delete data[key] 
    } 
    return data; 
} 

data = stripData(stripData(data)) 
+0

内部配列は単純な値を持ちます。私の内部配列のすべての要素がNULLのために削除された場合、その内部配列自体をメインのJSONオブジェクトから削除したいと考えました。 – user1614862

+0

内部配列の例を挙げることはできますか? – joemillervi

+0

私の質問の編集セクションに完全なJSONを提供しました。セカンダリグループからnullを持つエントリを1つ削除し、それがすべてのヌルエントリを持ち、すでに空のメタアレイを削除するので、secondaryPerformers自体を削除したいと考えています。 – user1614862

0
function removeNull(obj,key){ 
    var thisIsNull=false; 
    if(key==null||key==undefined){ 
     if(isJson(obj)){ 

      for(var i in obj){ 
       thisIsNull=removeNull(obj,i); 
      } 
     } 
    }else if(key !=null){ 
     if(isJson(obj[key])){ 
      var jsonIsNull=true; 
      for(var i in obj[key]){ 
       if(obj[key][i]!=null){ 
        jsonIsNull=false; 
       } 
       thisIsNull=removeNull(obj[key],i); 
      } 
      if(jsonIsNull){ 
       delete obj[key]; 

       thisIsNull=true;    } 
     }else if(obj[key]==null){ 
      delete obj[key]; 
     }else if(obj[key] instanceof Array){ 
      var arrIsNull=true; 
      for(var i in obj[key]){ 
       if(obj[key][i]!=null){ 
        arrIsNull=false; 
        thisIsNull=removeNull(obj[key],i); 
       }else{ 
        delete obj[key][i]; 
       } 
      } 
      if(arrIsNull){ 
       thisIsNull=true; 
       delete obj[key]; 
       thisIsNull=removeNull(obj); 
      } 
     } 


    } 
    if(thisIsNull){ 
     removeNull(obj); 
    } 
    return thisIsNull; 

} 

function isJson(obj){ 
    var isjson = typeof(obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length; 
    return isjson; 
} 
+0

removeNull(jsonObj); –

0
function deleteNulls(json) { 
    for (var key in json) { 
     if (Array.isArray(json[key])) { 
      json[key].forEach(function (Obj, index, Array) { 
       for (var property in Obj) { 
        if (Obj[property] == null) { 
         Array.splice(index, 1); 
        } 
       } 
      }); 
     } 
     if (json[key] == null || json[key].length == 0) {  
      delete json[key]; 
     } 
    } 
} 

deleteNulls(myObject); 
関連する問題