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