2017-02-03 7 views
2

我々はJSONファイルがあります:私たちは次のことを必要とするJSONファイルから子ノードへのトラバースや財産を見つける

var response = { 
    "Status": "Met", 
    "Text": "Text1", 
    "Id": "AAA", 
    "ContentItems": [ 
    { 
     "Selected": true, 
     "Text": "Text2", 
     "Id": "BBB" 
    }, 
    { 
     "Status": "Met", 
     "Text": "Text3", 
     "Id": "CCC",   
     "ContentItems": [ 
     { 
      "Selected": true, 
      "Text": "Text5", 
      "Id": "DDD" 
     }, 
     { 
      "Status": "Met", 
      "Text": "Text6", 
      "Id": "EEE", 
      "ContentItems": [ 
      { 
       "Selected": true, 
       "Text": "Text7", 
       "Id": "FFF" 
      }, 
      { 
       "Selected": true, 
       "Text": "Text8", 
       "Id": "GGG" 
      }, 
      { 
       "Status": "Met", 
       "Text": "Text9", 
       "Id": "III", 
       "ContentItems": [ 
       { 
        "Status": "Met", 
        "Text": "Text11", 
        "Id": "JJJ", 
        "ContentItems": [ 
        { 
         "Text": "Text12", 
         "Id": "77" 
        }, 
        { 
         "Status": "Met", 
         "Text": "Text13", 
         "Id": "10", 
         "ContentItems": [ 
         { 
          "Text": "Text14", 
          "Id": "45" 
         }, 
         { 
          "Selected": true, 
          "Text": "Text15", 
          "Id": "87" 
         }, 
         { 
          "Selected": true, 
          "Text": "Text16", 
          "Id": "80" 
         } 
         ] 
        }        
        ] 
       }, 
       { 
        "Status": "Met", 
        "Text": "Text17", 
        "Id": "KKK", 
        "ContentItems": [ 
        { 
         "Text": "Text18", 
         "Id": "12" 
        }, 
        { 
         "Status": "NotMet", 
         "Text": "Text19", 
         "Id": "14", 
         "ContentItems": [ 
         { 
          "Text": "Text20", 
          "Id": "55" 
         }, 
         { 
          "Selected": true, 
          "Text": "Text21", 
          "Id": "98" 
         } 
         ] 
        }        
        ] 
       } 
       ] 
      } 
      ] 
     } 
     ] 
    } 
    ] 
}; 

を:

1.Return真のすべての「ステータス」であれば"Met"です。

2.ステータスが「NotMet」の場合はfalseを返します。

子ノードは任意の深さにできます。私は各ノードを横断するために再帰関数を使用し、そこから子ノードをループして関数を再帰的に呼び出しています。

私はこのコードを試しましたが、期待通りに機能しませんでした。

function isStatusMet(response) { 
    if (response.Status == 'NotMet') { 
    return false; 
    } else { 
    if (response.ContentItems) { 
     if(Array.isArray(response.ContentItems)) { 
     for(var i = 0; i < response.ContentItems.length;i++) { 
      if (response.ContentItems[i].ContentItems) { 
      return isStatusMet(response.ContentItems[i]); 
      } else { 
      if (response.ContentItems[i].Status == 'NotMet') { 
       return false; 
      } else { 
       continue; 
      } 
      } 
     } 
     return true; 
     } 
    } 
    } 
} 
+0

[アクセス/プロセス(ネストされた)オブジェクト、アレイまたはJSON]の可能な重複(http://stackoverflow.com/questions/11922383/access-process-nested- objects-arrays-or-json) – Teemu

+0

for-loopの内部から戻ると、そのループの次のすべての介在はスキップされるので、コードは各ノードの最初の子だけをチェックします。 Array.every()はここで非常に便利です。 http://kapilkashyap.github.io/jquery-filter-json-plugin/ は、テキストエリアの中で上記のJSONを貼り付け:あなたはすでにjQueryのを使用している場合 – Shilly

+0

が、これはあなたが望む任意のプロパティのために役に立つかもしれませんデモを行い、プロパティ入力フィールドをプロパティとしてStatusに変更します(大文字と小文字が区別されます)。 [重複を避ける]チェックボックスをオンにして、[JSONフィルタ]ボタンをクリックすると、結果が表示されます。 –

答えて

1
var isStatusMet = function isStatusMet(data) { 
    // If the status is NotMet, we finish immediately 
    if (data.Status === 'NotMet') return false; 
    // Since only nodes with ContentItems have a status, we check if the node has children and recursively check if every child has no Status of NotMet 
    else if (data.hasOwnProperty('ContentItems')) return data.ContentItems.every(isStatusMet); 
    // We're dealing with a child without Status or Childnodes, so we just return true. 
    // Since the status in not met and the parent node of this node expects in its 'every' loop that we only return false for nodes that have Status NotMet, this makes the recusion work. 
    else return true; 
}; 

var met = isStatusMet(response); 

console.log(met); 
1

ステートメントreturn isStatusMet(response.ContentItems[i]);は、任意のステータスで早期終了を行います。再帰呼び出しがfalseと応答した場合は、falseを返します。そうでない場合は、ループを続行する必要があります。これに

変更を:ContentItemsが配列の場合

if (response.ContentItems[i].ContentItems) { 
    if (!isStatusMet(response.ContentItems[i])) return false; 
} 
1

あなたはArray#everyを使用することができますし、再帰的にそれを使用。

var data = { Status: "Met", Text: "Text1", Id: "AAA", ContentItems: [{ Selected: true, Text: "Text2", Id: "BBB" }, { Status: "Met", Text: "Text3", Id: "CCC", ContentItems: [{ Selected: true, Text: "Text5", Id: "DDD" }, { Status: "Met", Text: "Text6", Id: "EEE", ContentItems: [{ Selected: true, Text: "Text7", Id: "FFF" }, { Selected: true, Text: "Text8", Id: "GGG" }, { Status: "Met", Text: "Text9", Id: "III", ContentItems: [{ Status: "Met", Text: "Text11", Id: "JJJ", ContentItems: [{ Text: "Text12", Id: 77 }, { Status: "Met", Text: "Text13", Id: 10, ContentItems: [{ Text: "Text14", Id: 45 }, { Selected: true, Text: "Text15", Id: 87 }, { Selected: true, Text: "Text16", Id: 80 }] }] }, { Status: "Met", Text: "Text17", Id: "KKK", ContentItems: [{ Text: "Text18", Id: 12 }, { Status: "NotMet", Text: "Text19", Id: 14, ContentItems: [{ Text: "Text20", Id: 55 }, { Selected: true, Text: "Text21", Id: 98 }] }] }] }] }] }] }, 
 
    result = [data].every(function iter(a) { 
 
     return a.Status !== 'NotMet' && (!Array.isArray(a.ContentItems) || a.ContentItems.every(iter)); 
 
    }); 
 

 
console.log(result);

関連する問題