2017-02-01 4 views
0

のすべてのネストされたオブジェクトが、私は、次のJSONがあるとしCouting各オブジェクトの?のJavascript JSON

例:

  • "C" の目的は、サブオブジェクトの内側とに2つのオブジェクト、 "D" および "E" を有します。
  • "W"オブジェクトには、サブオブジェクト "X"、 "Y"、および "Z"の内側と内側に3つのオブジェクトがあります。有するovject
  • 「V」4つのオブジェクトの内部とサブオブジェクト、「W」オブジェクト自体とそのチャイルズ(上述3つのもの)の全てに(ここでトリックです)。

「C」オブジェクトにはプロパティがあり、番号2を含む「allBelow」という名前を付ける必要があります.3を含むWオブジェクトと4を含む「V」オブジェクト。それぞれのオブジェクトに対してオンになります。

再帰関数の中にはこのジョブを実行できるものがありますが、私はそれを達成できません。

私を助けてもらえますか?

カテゴリーで探す、

答えて

2

var myObj = {"id":"foo","list":[{"id":"A","list":[{"id":"B","list":[{"id":"C","list":[{"id":"D","list":[]},{"id":"E","list":[]}]},{"id":"F","list":[]},{"id":"G","list":[{"id":"H","list":[]},{"id":"I","list":[]},{"id":"J","list":[]}]}]},{"id":"K","list":[]}]},{"id":"L","list":[{"id":"M","list":[]}]},{"id":"N","list":[]},{"id":"O","list":[{"id":"P","list":[{"id":"Q","list":[]},{"id":"R","list":[]},{"id":"S","list":[]},{"id":"T","list":[{"id":"U","list":[]}]},{"id":"V","list":[{"id":"W","list":[{"id":"X","list":[]},{"id":"Y","list":[]},{"id":"Z","list":[]}]}]}]}]}]}; 
 

 
function count(obj) { 
 
    var c = obj.list.length; 
 
    c += obj.list.reduce((a, e) => a + count(e), 0); 
 
    obj.count = c; // assign the count after counting the subobjects. 
 
    return c; // return the count to be used by parent objects 
 
} 
 

 
count(myObj); 
 

 
console.log(myObj);

+0

reduce、gtzの本当にクールな使用 – Th0rndike

+0

ありがとうございます@ ibrahim-mahrir !!! それは機能しました! 今私はそれを理解するために少し時間を費やすつもりです! LOL 他のユーザーに明確にするためにreplを使用しました。 https://repl.it/F3Tk/0 –

+1

@LeandroFerreiraFernandesようこそ!それらは** Arrow Functions **と呼ばれ、数日前にそれらを学んだだけです。彼らは素晴らしいです。 [ここ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)は、mozillaからのそれらのクイックリファレンスです。あなたがそれらを学ぶとき、あなたはどれくらいクールであるかを知るでしょう。 –

0

深さ優先探索が、私はこのような何か(未テストCODEを)考えています動作するはずです:

function DFS(tree){ 
    var currentCount = tree.list.length; 
    for(var i=0;i<count;i++){ 
     currentCount += DFS(tree.list[i]); 
    } 
    tree["count"] = currentCount; 
    return currentCount; 
} 
+0

は、これが唯一のこれは彼が尋ねたものではない直接の子 – fafl

+0

の数をカウントします。 「W」オブジェクトそのものとそのすべての子(前述の3つのもの)_ _ "V" ovjectには、4つのオブジェクトがサブオブジェクト内とサブオブジェクトにあります。 –

+0

私はこれを試しましたが、うまくいきませんでした。 –

0

再帰関数は良いアイデアです。それは最初の各子ノードに自分自身を呼び出す

var data = {"id":"foo","list":[{"id":"A","list":[{"id":"B","list":[{"id":"C","list":[{"id":"D","list":[]},{"id":"E","list":[]}]},{"id":"F","list":[]},{"id":"G","list":[{"id":"H","list":[]},{"id":"I","list":[]},{"id":"J","list":[]}]}]},{"id":"K","list":[]}]},{"id":"L","list":[{"id":"M","list":[]}]},{"id":"N","list":[]},{"id":"O","list":[{"id":"P","list":[{"id":"Q","list":[]},{"id":"R","list":[]},{"id":"S","list":[]},{"id":"T","list":[{"id":"U","list":[]}]},{"id":"V","list":[{"id":"W","list":[{"id":"X","list":[]},{"id":"Y","list":[]},{"id":"Z","list":[]}]}]}]}]}]}; 
 

 
function addCount(node) { 
 
    node.count = 0; 
 
    for (var i = 0; i < node.list.length; i++) { 
 
    var child = node.list[i]; 
 
    addCount(child); 
 
    node.count += child.count + 1; 
 
    } 
 
} 
 

 
addCount(data); 
 
console.log(data)

:これを試してみてください。次に、各子を1 +孫の数(または壮大な - またはそれ以上)としてカウントに追加します。

1

あなたは、単純なDFSを行うことができます。

function appendNumChildren(currentNode) { 
    const totalChildren = currentNode.list.reduce((acc, node) => { 
    return acc + appendNumChildren(node); 
    }, 0) 

    currentNode.allBelow = totalChildren; 

    return totalChildren + 1; 
} 

appendNumChildren(json); 

https://jsbin.com/qekabatuwi/edit?js,console

+0

これもうまくいった= D \ o/ ありがとう! –