2016-08-26 1 views
5

が、私は次のようにJSONレスポンスは、フォームでバックエンドからそこに来て、ユースケース持っているすべてのアレイの削除:0 ==私は力を持っているすべてのオブジェクトを削除する必要がパワー== 0

[ 
    { 
    "name": "cab", 
    "child": [ 
     { 
     "name": "def", 
     "child": [ 
      { 
      "name": "ghi", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    }, 
    { 
    "name": "hhi", 
    "child": [ 
     { 
     "name": "hhi2", 
     "child": [ 
      { 
      "name": "hhi3", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    } 
] 

を配列の単純なコレクションでフィルタを使用するのは簡単ですが、n個の子がn個の子を含む場合があります。

ありがとうございます!

+1

? –

+2

あなたの目的のために、文字列 '' 0.00 "' '0 'と同じであると思われますか?また、親アイテムに0の力があるが、その子のパワーが0でない場合、親アイテム(したがってすべての子アイテム)を削除する必要がありますか? – nnnnnn

+0

@nnnnnn、0.00は文字列であり、出力== 0.00がチェックである必要があります。 –

答えて

5

:これは何

var json = ["JSON_HERE"]; 
function deleteIterator(json) { 
    if(json.power == "0.00") { 
    return null; 
    } else if(json.child) { 
    json.child = deleteIterator(json.child); 
    } 
    return json; 
} 
for(var i = 0; i < json.length; i++) { 
    json[i] = deleteIterator(json[i]); 
} 

です:JSONの子供を超える

  1. 反復。
  2. 電源が"0.00"であることを確認してください。
    • もしそうであれば、それは、その後、
  3. (ステップ2に進みます)、それを反復しなければ、それは子供
    • を持っている場合、
    nullを返す)チェックを、それを削除するには
  4. JSON要素を返します。
+1

それはそれをやるよ:) –

+0

['for ... in'を使って配列を反復処理しない](http://stackoverflow.com/q/500504/5743988)、あなたがグローバルを作成しないように 'i'を宣言します。 – 4castle

+0

Gotcha @ 4castle –

2

オブジェクトを反復的に反復し、毎回子を探して、パワー=== 0または要件に応じてフィルタリングします。

再帰の使用方法がわからない場合は、here is a tutorialを起動してください。私は本当に誰かが私の後ろに来ることはありませんし、あなたに問題の正確な解決策を渡すことを願っています。これはあなたが再帰を使う方法を知っていればあなた自身で解決できるはずです。ループを使用することもできますが、再帰が最適です。

編集:この問題はbeforeという異なる風味で解決されましたが、すべて同じです。あなたの実装がバグを持つことがわかった場合は、気にしないでください。新しい質問で私に言い聞かせてください。私はあなたを助けるために最善を尽くします。ただ、再帰関数で配列を反復

+3

はい、それはです回答。人はそれをやる方法を知りたがっています。私は彼に方法を示した。私は彼に正確なコードを与える必要はないし、そうすることは悪い考えだと思う。私たちは、SOユーザーがこのサイトを「ペーストをコピーして理解できないコードを尋ねて受け取る」ように見せてはいけません。代わりに人々に問題を解決する手段を与えてください。 –

+0

@patrik:あなたが意味することを理解しています。もう一度ありがとう:) –

1

名前付き関数式でArray#filterを使用して再帰的に繰り返すことができます:あなたは再帰が何であるかを知っています

var objArray = [{"name":"cab","child":[{"name":"def","child":[{"name":"ghi","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true},{"name":"hhi","child":[{"name":"hhi2","child":[{"name":"hhi3","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true}]; 
 

 
objArray = _.filter(objArray, function powerFilter(o) { 
 
    if (o.power == 0) return false; 
 
    if (o.isParent && o.child) { 
 
    o.child = _.filter(o.child, powerFilter); // recursive call 
 
    o.isParent = o.child.length > 0; 
 
    if (!o.isParent) delete o.child; 
 
    } 
 
    return true; 
 
}); 
 

 
console.log(objArray);
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>

+0

余分な 'return'ステートメントのタイプミス?また、 'filter()'関数のそのコールバック関数の名前を付ける必要があります(慣例は無名関数です、正しい?) –

+0

@LambdaNinja再帰的に参照するには、名前を付ける必要があります。参考までに[この回答](http://stackoverflow.com/a/38132582/5743988)を参照してください。タイプミスは何ですか? – 4castle

+0

編集で入力ミスが修正されました。以前の名前の目的はわかりませんでした。ニースの解決策。 +1。 –