树下面所有子节点求和

qq_28671649 2018-07-18 10:24:17
树的结构如下:
var data ={
"code": 0,
"msg": "",
"count": 1,
"data": [{
"id": 651,
"name": "\u4f55\u79c0\u83ca",
"code": "HBBZ00000728",
"organization": 24,
"presell": 120094.30000000002,
"underwrite": 120094.30000000002,
"PresellMarks": 103512.99999999999,
"UnderwriteMarks": 103512.99999999999,
"children": [{
"id": 379,
"name": "\u6768\u4e3d\u654f",
"code": "HBBZ00001009",
"organization": 24,
"presell": 0,
"underwrite": 0,
"PresellMarks": 0,
"UnderwriteMarks": 0,
"children": ""
}, {
"id": 380,
"name": "\u90ed\u5a1c",
"code": "HBBZ00001008",
"organization": 24,
"presell": 0,
"underwrite": 0,
"PresellMarks": 0,
"UnderwriteMarks": 0,
"children": ""
}, {
"id": 493,
"name": "\u4f55\u53cb\u83ca",
"code": "HBBZ00000898",
"organization": 24,
"presell": 5080.07,
"underwrite": 5080.07,
"PresellMarks": 4491.22,
"UnderwriteMarks": 4491.22,
"children": ""
}, {
"id": 599,
"name": "\u97e9\u4e9a\u6d32",
"code": "HBBZ00000780",
"organization": 24,
"presell": 2010.0,
"underwrite": 0.0,
"PresellMarks": 2010.0,
"UnderwriteMarks": 0.0,
"children": ""
}, {
"id": 628,
"name": "\u6768\u6625\u8273",
"code": "HBBZ00000751",
"organization": 24,
"presell": 18411.29,
"underwrite": 3727.12,
"PresellMarks": 14915.29,
"UnderwriteMarks": 231.12,
"children": ""
}],
"Crown": 6,
"Overall": 6,
"AllPerformance": 124929.50999999998
}]
}
求树下面所有子节点PresellMarks的和
...全文
406 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ambit_tsai-微信 2018-07-18
  • 打赏
  • 举报
回复
引用 6 楼 ambit_tsai 的回复:
利用reduce进行多级累加

function sum(total, item){
total += item.PresellMarks;
if(item.children){ // 若有子节点,则累加子节点的数值
total = item.children.reduce(sum, total);
}
return total;
}
// 调用sum函数,对data.data进行累加
data.data.reduce(sum, 0);

ambit_tsai-微信 2018-07-18
  • 打赏
  • 举报
回复
利用reduce进行多级累加

function sum(total, item){
total += item.PresellMarks;
if(item.children){ // 若有子节点,则累加子节点的数值
total = item.children.reduce(sum, total);
}
return total;
}
// 调用sum函数,对data.data进行累加
data.data.reduce(sum, 0);
FFF279469961 2018-07-18
  • 打赏
  • 举报
回复
var num = 0;
function fn(data){
for(var a in data){
if(typeof data[a] == "object"){
//fn(data[a])用下面我觉得比较好 起码可以降低耦合性
arguments.callee(data[a])
}else{
if(a == "PresellMarks"){
num += data[a];
}
}
}
}
fn(data);
console.log(num);
qq_28671649 2018-07-18
  • 打赏
  • 举报
回复
引用 2 楼 foren_whb 的回复:
格式化后看了一下,这么简单的二级树,递归都不用了:

function sumPresellMarks(o){
var re = 0;
for(var i = 0; i < o.data.length; i++){
re += o.data[i].PresellMarks;
if(o.data[i].children){
for(var j = 0; j < o.data[i].children.length; j++){
re += o.data[i].children[j].PresellMarks;
}
}
}
return re;
}

如果有很多级递归怎么实现?
FFF279469961 2018-07-18
  • 打赏
  • 举报
回复
格式确定不变的话上面就ok了 要是不确定的话 就递归一下就行。
var num = 0;
function fn(data){
for(var a in data){
if(typeof data[a] == "object"){
fn(data[a])
}else{
if(a == "PresellMarks"){
num += data[a];
}
}
}
}
fn(data);
console.log(num);
丰云 2018-07-18
  • 打赏
  • 举报
回复
格式化后看了一下,这么简单的二级树,递归都不用了:

function sumPresellMarks(o){
var re = 0;
for(var i = 0; i < o.data.length; i++){
re += o.data[i].PresellMarks;
if(o.data[i].children){
for(var j = 0; j < o.data[i].children.length; j++){
re += o.data[i].children[j].PresellMarks;
}
}
}
return re;
}
丰云 2018-07-18
  • 打赏
  • 举报
回复
妹的,就不能格式化一个??
看起来真累

简单递归遍历,很基础的算法实现吧。。。。

87,989

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧