2017-01-19 9 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

Так ведь вы хотите сделать что-н, как это: каждого эль просит его Чайлдс своих ценностей, эти сделать то же самое и вернуть свои totalValues ​​плюс их собственную ценность.

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

Start, как это:

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

Рабочий пример: http://jsbin.com/laxiveyoki/edit?console

+0

Я немного смущен, моя цель состоит не в том, чтобы получить общее значение всех значений внутри объекта. Я пытаюсь заполнить каждый totalValue каждого узла только суммой своих значений child/subchildren. Результат должен быть тем же самым списком, но со всеми заполненными totalValues ​​(только если этот узел содержит детей). – Sam

+0

@Sam это делает корыта object.totalValue + = sumUp (дети); –

+0

Посмотрите на дерево примеров, которое регистрируется. Вы обнаружите, что 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; }