2017-01-19 2 views
1

子供の数に制限のない深くネストされたjavascriptオブジェクトがあります。すべての子は値とtotalValueを持っています。 totalValueは、すべての子と子要素のすべての値の合計でなければなりません。どうすればこの作品を作れますか?再帰関数を使用して、私は唯一のループすることができるよ瞬間、オブジェクト全体でネストされたjavascriptオブジェクト内のすべての子の値の合計としての親の値

// Recursive function 
_.each(names, function(parent) { 
    if(parent.children.length > 0) { 
     recursiveFunction(parent.children); 
    } 
}); 

function recursiveFunction(children){ 
    _.each(children, function(child) { 
     if(child.children.length > 0) { 
      recursiveFunction(child.children) 
     } 
    }); 
}; 

// Deeply nested javascript object 
var names = { 
    name: 'name-1', 
    value: 10, 
    valueTotal: 0, // should be 60 (name-1.1 + name-1.2 + name-1.2.1 + name-1.2.2 + name-1.2.2.1 + name-1.2.2.2) 
    children: [{ 
      name: 'name-1.1', 
      value: 10, 
      valueTotal: 0, 
      children: [] 
     }, { 
      name: 'name-1.2', 
      value: 10, 
      valueTotal: 0, // should be 40 (name-1.2.1 + name-1.2.2 + name-1.2.2.1 + name-1.2.2.2) 
      children: [{ 
       name: 'name-1.2.1', 
       value: 10, 
       valueTotal: 0, 
       children: [] 
      }, { 
       name: 'name-1.2.2', 
       value: 10, 
       valueTotal: 0, // should be 20 (name-1.2.2.1 + name-1.2.2.2) 
       children: [{ 
        name: 'name-1.2.2.1', 
        value: 10, 
        valueTotal: 0, 
        children: [] 
       }, { 
        name: 'name-1.2.2.2', 
        value: 10, 
        valueTotal: 0, 
        children: [] 
       }] 
      }] 
     }] 
    } 
} 
+1

あなたの合計が間違って見え、名前-2は、名前-1の子であり、含まれるべきです。 –

+1

あなたの権利!私はそれを変更します。 – Sam

答えて

3

だから、実際には、あなたがこのようSTHを行いたい: すべてのelemは、これらの、その値のための彼のチャイルズを尋ね同じことをして、totalValuesに自分の値を加えたものを返す。このような

function sumUp(object){ 
object.totalValue=0; 
for(child of object.children){ 
object.totalValue+=sumUp(child); 
} 
return object.totalValue+object.value; 
} 

スタート:

totalofall=sumUp(names); 
console.log(names);//your expected result. 

の作業例: http://jsbin.com/laxiveyoki/edit?console

+0

私は少し混乱しています、私の目標は、オブジェクト内のすべての値の合計値を取得することではありません。私はすべてのノードのすべてのtotalValueに、その子/子孫の値の合計だけを入力しようとしています。結果は同じリストでなければなりませんが、すべてのtotalValuesが入力されます(ノードに子が含まれている場合のみ)。 – Sam

+0

@Samそれはトラフを行いますobject.totalValue + = sumUp(children); –

+0

ログに記録されているexamplesツリーを見てください。あなたはtotalValueには、あなたが探しているものが含まれていることがわかります –

1

あなたは、反復して再帰的なアプローチと地方合計のためのいくつかの健全性チェックと無地Javascriptを使用することができます。

function calculateValues(o) { 
 
    o.valueTotal = (o.children || []).reduce(function (r, a) { 
 
     calculateValues(a); \t \t \t \t 
 
     return r + (a.value || 0) + (a.valueTotal || 0); 
 
    }, 0); 
 
} 
 

 
var names = { name: 'name-1', value: 10, valueTotal: 0, children: [{ name: 'name-1.1', value: 10, valueTotal: 0, children: [] }, { name: 'name-1.2', value: 10, valueTotal: 0, children: [{ name: 'name-1.2.1', value: 10, valueTotal: 0, children: [] }, { name: 'name-1.2.2', value: 10, valueTotal: 0, children: [{ name: 'name-1.2.2.1', value: 10, valueTotal: 0, children: [] }, { name: 'name-1.2.2.2', value: 10, valueTotal: 0, children: [] }] }] }] }; 
 

 
calculateValues(names); 
 
console.log(names);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題