Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环遍历Javascript对象以基于子对象添加小计_Javascript_Loops - Fatal编程技术网

循环遍历Javascript对象以基于子对象添加小计

循环遍历Javascript对象以基于子对象添加小计,javascript,loops,Javascript,Loops,我有一个JavaScript对象,如下所示: { "name":"root", "children":[ { "name":"Oct 2014", "children":[ { "name":"Books", "value":106223, "formattedValue":"$106,223" },

我有一个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
注意:不保证数据集始终具有相同的“深度”。在这种情况下,对象有两个级别,而在其他情况下,对象可能有更多或更少的级别。我正试图在循环中解释这一点


会随着我了解更多的事情而更新。。。感谢任何人在此期间提供的任何意见

首先,如果您没有正确理解请求,请道歉

这就是我迄今为止所尝试的:

var json={
“名称”:“根”,
“儿童”:[
{
“名称”:“2014年10月”,
“儿童”:[
{
“名称”:“书籍”,
“价值”:106223,
“formattedValue”:“$106223”
},
{
“名称”:“电子产品”,
“价值”:983933,
“formattedValue”:“$983933”
}
]
},
{
“名称”:“2014年11月”,
“儿童”:[
{
“名称”:“书籍”,
“价值”:117588.7,
“formattedValue”:“$117589”
},
{
“名称”:“电子产品”,
“价值”:992779,
“formattedValue”:“$992779”
}
]
}
]
};
(函数processCurrent(对象){
var处理结果;
object.value=object.value | | 0;
if(object.children){

对于(var i=0;i递归确实是您所寻找的

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);
函数getChildrenValue(父级){ if(父项、子项){ var值=0;
对于(var i=0;i这将为您提供:

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);

递归就是你想要的for@hindmost,递归在这里可能没有帮助,因为从父级到子级的结构不一致。@loco,最底层的子级是否总是比根级低2级?如果不是,请解释。@Jonathan M,不,很遗憾不是。我正在将可视化集成到分析平台中。有多少子级每个父对象的属性都可能因所使用的数据集而异,而且这些数据集往往易于调整,因此这也需要是动态的。但最底层的子对象总是可以有一个值和一个name元素。我想也许完整的JSON对象可以存储在一个变量中。可以调用一个函数来循环最底层的子对象如果父节点没有值元素,则将子节点的值元素之和作为值元素添加到父节点中。然后向后操作,直到顶级父节点有一个值节点及其子节点之和。仍在研究如何在代码中设计此函数。有一个正确的算法实现,我们都在双重的。不过,我认为我的实现更清晰一些。谢谢你的回答,两种方法都有效,但我更喜欢@J4G答案的清晰性。
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);