2015-09-09 2 views
1

У меня есть объект JavaScript следующим образом:Перебора объекта Javascript для добавления подытогов на основе дочерних объектов

{ 
    "name":"root", 
    "children":[ 
     { 
     "name":"Oct 2014", 
     "children":[ 
      { 
       "name":"Books", 
       "value":106223, 
       "formattedValue":"$106,223" 
      }, 
      { 
       "name":"Electronics", 
       "value":983933, 
       "formattedValue":"$983,933" 
      } 
     ] 
     }, 
     { 
     "name":"Nov 2014", 
     "children":[ 
      { 
       "name":"Books", 
       "value":117588.7, 
       "formattedValue":"$117,589" 
      }, 
      { 
       "name":"Electronics", 
       "value":992779, 
       "formattedValue":"$992,779" 
      } 
     ] 
     } 
    ] 
} 

мне интересно, как я могу цикл по самому низким детям объекта, и работать свой путь в обратном направлении, прагматично , чтобы добавить элемент «значение» к каждому родительскому объекту, где это значение является суммой дочерних объектов. Таким образом, в приведенном выше примере, это результат я пытаюсь добраться до:

{ 
    "name":"root", 
    "children":[ 
     { 
     "name":"Oct 2014", 
     "children":[ 
      { 
       "name":"Books", 
       "value":106223, 
       "formattedValue":"$106,223" 
      }, 
      { 
       "name":"Electronics", 
       "value":983933, 
       "formattedValue":"$983,933" 
      } 
     ], 
     "value":10900156 
     }, 
     { 
     "name":"Nov 2014", 
     "children":[ 
      { 
       "name":"Books", 
       "value":117588.7, 
       "formattedValue":"$117,589" 
      }, 
      { 
       "name":"Electronics", 
       "value":992779, 
       "formattedValue":"$992,779" 
      } 
     ], 
     "value":1110367.7 
     } 
    ] 
} 

Может кто-то дать указания в том, как я могу добраться до низового большинства детей, а также добавить ценность каждого ребенка в родитель, образуя промежуточные итоги?

вещи я понял, до сих пор:

  • Количество детей в объекте: root.children.length.
  • Перебор верхних детей:
for(var i = 0; i < root.children.length;i++){ 
var obj = root.children[i]; 
console.log("name: "+obj["name"]); 
console.log("value: "+obj["value"]); 
} 

Примечание: набор данных не гарантируется всегда имеют одинаковую «глубину». Хотя в этом случае объект имеет 2 уровня, в других сценариях он может иметь больше или меньше. Я пытаюсь объяснить это в цикле.

Будет обновляться, поскольку я больше узнаю ... спасибо за любой вклад, который любой может предоставить за это время!

+0

Рекурсия, что вы ищете – hindmost

+0

@hindmost, рекурсия не может помочь здесь, потому что структура не соответствует от родителя к ребенку. –

+0

@loco, самые нижние дети всегда будут на 2 уровня ниже корня? Если нет, объясните. –

ответ

1

Рекурсия действительно то, что вы ищете.

function getChildrenValue (parent) { 
    if (parent.children) { 
     var value = 0; 
     for (var i=0;i<parent.children.length;i++) { 
     var child = parent.children[i]; 
     value += getChildrenValue(child); 
     } 
     parent.value = value; 
    } 
    return parent.value; 
} 

//var root = yourJSONData  
getChildrenValue(root); 
console.log(root); 
+0

это просто повторяет мой ответ ... – smnbbrv

+0

Существует правильная алгоритмическая реализация, которую мы оба достигли индивидуально. Однако я бы сказал, что моя реализация немного ясна. – Harangue

1

Прежде всего, извините, если не понял запрос правильно.

Это то, что я пытался до сих пор:

var json = { 
 
    "name":"root", 
 
    "children":[ 
 
    { 
 
     "name":"Oct 2014", 
 
     "children":[ 
 
     { 
 
      "name":"Books", 
 
      "value":106223, 
 
      "formattedValue":"$106,223" 
 
     }, 
 
     { 
 
      "name":"Electronics", 
 
      "value":983933, 
 
      "formattedValue":"$983,933" 
 
     } 
 
     ] 
 
    }, 
 
    { 
 
     "name":"Nov 2014", 
 
     "children":[ 
 
     { 
 
      "name":"Books", 
 
      "value":117588.7, 
 
      "formattedValue":"$117,589" 
 
     }, 
 
     { 
 
      "name":"Electronics", 
 
      "value":992779, 
 
      "formattedValue":"$992,779" 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}; 
 

 
(function processCurrent(object) { 
 
    var processResult; 
 

 
    object.value = object.value || 0; 
 

 
    if (object.children) { 
 
    for (var i=0;i<object.children.length;i++) { 
 
     if (processResult = processCurrent(object.children[i])) { 
 
     object.value += processResult; 
 
     } 
 
    } 
 
    } 
 

 
    return object.value; 
 
})(json); 
 

 
console.log(JSON.stringify(json));

Это рекурсивно проходит через объект и вычисляет сумму всех детей для каждого узла.

+0

Спасибо за ответ, в обоих направлениях, но я предпочел ясность ответа @ J4G. – Tiago

0

Это будет делать это для вас:

var jsonData = { 
"name":"root", 
"children":[ 
    { 
     "name":"Oct 2014", 
     "children":[ 
     { 
      "name":"Books", 
      "value":106223, 
      "formattedValue":"$106,223" 
     }, 
     { 
      "name":"Electronics", 
      "value":983933, 
      "formattedValue":"$983,933" 
     } 
     ] 
    }, 
    { 
     "name":"Nov 2014", 
     "children":[ 
     { 
      "name":"Books", 
      "value":117588.7, 
      "formattedValue":"$117,589" 
     }, 
     { 
      "name":"Electronics", 
      "value":992779, 
      "formattedValue":"$992,779" 
     } 
     ] 
    } 
] 
} 

jsonData.children.map(function (obj) { 
    return obj.value = obj.children.reduce(function(prev, cur){ 
     return prev.value + cur.value; 
    }) 
}) 
console.log(jsonData);