如何使用javascript将每个子节点的值汇总到JSON中的父节点?
我从服务器接收到一个结构流畅的JSON。哪个是章节在根目录下有一个阶段和/或审查集。如果一个阶段确实存在,那么将有一个对象数组或另一个阶段。查看集包含两个保存数据的属性 下面是示例JSON如何使用javascript将每个子节点的值汇总到JSON中的父节点?,javascript,angularjs,json,Javascript,Angularjs,Json,我从服务器接收到一个结构流畅的JSON。哪个是章节在根目录下有一个阶段和/或审查集。如果一个阶段确实存在,那么将有一个对象数组或另一个阶段。查看集包含两个保存数据的属性 下面是示例JSON { "id": "chapter", "chapterName": "Example Chapter", "stages": [ { "id": "stage", "stages": [
{
"id": "chapter",
"chapterName": "Example Chapter",
"stages": [
{
"id": "stage",
"stages": [
{
"id": "stage",
"stages": [],
"reviewSets": [
{
"id":"reviewset-1",
"yettoanswer": 2,
"answered": 4
}
],
}
],
"reviewSets": [
{
"id": "reviewset-2",
"yettoanswer": 3,
"answered": 5
},
{
"id": "rewviewset-3",
"yettoanswer": 6,
"answered": 0
}
]
},
{
"id": "stage",
"stages": [
{
"id": "stage",
"stages": [],
"reviewSets": [
{
"id": "reviewset-4",
"yettoanswer": 0,
"answered": 8
},
{
"id": "reviewset-5",
"yettoanswer": 4,
"answered": 4
}
]
}
],
"reviewSets": [
{
"id": "reviewset-6",
"yettoanswer": 1,
"answered": 2
},
{
"id": "reviewset-7",
"yettoanswer": 6,
"answered": 4
}
]
}
],
"reviewSets": [
{
"id": "reviewset-8",
"yettoanswer": 0,
"answered": 2
},
{
"id": "reviewset-9",
"yettoanswer": 1,
"answered": 2
}
],
}
请注意,阶段和审阅集是对象数组。它可以是null、一个对象或多个对象
我想得到每个“阶段”和根的“yettoanswer”和“Answeed”的计数。我正在寻找的结果如下:
{
"id": "chapter",
"chapterName": "Example Chapter",
"yettoanswer" : 22,
"answered" : 31,
"stages": [
{
"id": "stage",
"yettoanswer" : 11,
"answered" : 9,
"stages": [
{
"id": "stage",
"yettoanswer" : 2,
"answered" : 4,
"stages": [],
"reviewSets": [
{
"id":"reviewset-1",
"yettoanswer": 2,
"answered": 4
}
],
}
],
"reviewSets": [
{
"id": "reviewset-2",
"yettoanswer": 3,
"answered": 5
},
{
"id": "rewviewset-3",
"yettoanswer": 6,
"answered": 0
}
]
},
{
"id": "stage",
"yettoanswer":11,
"answered":18,
"stages": [
{
"id": "stage",
"yettoanswer":4,
"answered" : 12,
"stages": [],
"reviewSets": [
{
"id": "reviewset-4",
"yettoanswer": 0,
"answered": 8
},
{
"id": "reviewset-5",
"yettoanswer": 4,
"answered": 4
}
]
}
],
"reviewSets": [
{
"id": "reviewset-6",
"yettoanswer": 1,
"answered": 2
},
{
"id": "reviewset-7",
"yettoanswer": 6,
"answered": 4
}
]
}
],
"reviewSets": [
{
"id": "reviewset-8",
"yettoanswer": 0,
"answered": 2
},
{
"id": "reviewset-9",
"yettoanswer": 1,
"answered": 2
}
],
}
我想用javascript实现上面的功能 正如尼娜在评论中提到的那样,您可能忘记了将
reviewSet
s的yettoanswer
s计算在根目录中,因为(根据您的逻辑)应该是23,而不是22
var root=JSON.parse({“id”:“chapter”,“chapterName”:“示例章”,“stages”:[{“id”:“stage”,“stages”:[{“id”:“stage”,“stages”:[],“reviews”:[{“id”:“reviews-1”,“yettoanswer”:2,“responsed”:4}]}],“reviews”:[{“id”:“reviews-2”,“yettoanswer”:3,“responsed”:5},{“id”:“rewviewset-3”,“yettoanswer,“回答:0},{id:“stage”,“stages:”[{id:“stage”,“stages:”[],“reviewset:”[{id:“reviewset-4”,“yettoanswer”:0,“responsed”:8},{id:“reviewset-5”,“yettoanswer”:4,“reviewset:”[{id:“reviewset-6”,“yettoanswer:”1,“responsed:“reviewset-7”,“yettoanswer”:6,“responsed”:4},”复习集“:[{id:“复习集-8”,“回答:0”,“回答:2},{id:“复习集-9”,“回答:1”,“回答:2}]}”);
sumAnswers(根);
console.log(root);//`JSON.stringify(root)`如果需要JSON结果
职能部门(阶段){
//将新特性引入当前阶段
stage.yettoanswer=0;
stage.responsed=0;
//总结评论的价值
stage.reviews.forEach(函数(子函数){
stage.yettoanswer+=child.yettoanswer;
stage.answered+=child.answered;
});
//为每个阶段调用此函数,然后
//总结阶段的价值
stage.stages.forEach(函数(子函数){
Sum(儿童);
stage.yettoanswer+=child.yettoanswer;
stage.answered+=child.answered;
});
}
正如尼娜在评论中提到的,您可能忘记了将reviewSet
s的yettoanswer
s计算在根目录中,因为(根据您的逻辑)应该是23,而不是22
var root=JSON.parse({“id”:“chapter”,“chapterName”:“示例章”,“stages”:[{“id”:“stage”,“stages”:[{“id”:“stage”,“stages”:[],“reviewset”:[{“id”:“reviewset-1”,“yettoanswer”:2,“responsed”:4}]}],“reviewSets”:[{“id”:“reviewset-2”,“yettoanswer”:3,“responsed”:5},{“id”:“rewviewset-3”,“yettoanswer回答:0},{“id”:“stage”,“stages”:[{“id”:“stage”,“stages”:[],“reviewset”:[{“id”:“reviewset-4”,“yettoanswer”:0,“responsed”:8},{“id”:“reviewset-5”,“yettoanswer”:4,“reviewset”:[{“id”:“reviewset-6”,“yettoanswer”:1,“responsed”:2},{“id”:“reviewset-7”,“yettoanswer”:6,“responsed”:4},”复习集“:[{id:“复习集-8”,“回答:0”,“回答:2},{id:“复习集-9”,“回答:1”,“回答:2}]}”);
sumAnswers(根);
console.log(root);//`JSON.stringify(root)`如果需要JSON结果
职能部门(阶段){
//将新特性引入当前阶段
stage.yettoanswer=0;
stage.responsed=0;
//总结评论的价值
stage.reviews.forEach(函数(子函数){
stage.yettoanswer+=child.yettoanswer;
stage.answered+=child.answered;
});
//为每个阶段调用此函数,然后
//总结阶段的价值
stage.stages.forEach(函数(子函数){
Sum(儿童);
stage.yettoanswer+=child.yettoanswer;
stage.answered+=child.answered;
});
}
您可以迭代相关键并构建子级别的总和。将属性分配给实际级别
var object={id:“chapter”,chapterName:“示例chapter”,stages:[{id:“stage”,stages:[{id:“stage”,stages:[],reviewset:[{id:“reviewset-1”,yettoanswer:2,reswered:4},}],reviewset:[{id:“reviewset-2”,yettoanswer:3,reswered:5},{id:“rewviewset-3”,yettoanswer:6,reswered:0},{id:“stages阶段,阶段:[],复习集:[{id:“复习集-4”,回答:0,回答:8},{id:“复习集-5”,回答:4,回答:4}],复习集:[{id:“复习集-6”,回答:1,回答:2},{id:“复习集-7”,回答:6,回答:4}],复习集:[{id:“复习集-8”,回答:0,回答:2},{id:“复习集-9“,Yetto回答:1,回答:2}]};
[对象].reduce(函数和(r,o){
var v=['stages','reviewSets'].reduce(函数(r,k){
返回(o[k]| |[])。减少(总和,r);
},{yettoanswer:0,reswered:0});
Object.keys(r).forEach(函数(k){
o[k]=(o[k]| | 0)+v[k];
r[k]+=o[k];
});
返回r;
},{yettoanswer:0,Answer:0})
console.log(对象)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以迭代相关键并构建子级别的总和。将属性指定给实际级别
var object={id:“chapter”,chapterName:“示例chapter”,stages:[{id:“stage”,stages:[{id:“stage”,stages:[],reviewset:[{id:“reviewset-1”,yettoanswer:2,reswered:4},}],reviewset:[{id:“reviewset-2”,yettoanswer:3,reswered:5},{id:“rewviewset-3”,yettoanswer:6,reswered:0},{id:“stages“阶段”,阶段:[],复习集:[{id:“复习集-4”,回答:0,回答:8},{id:“复习集-5”,回答:4,回答