蝴蝶不菲
let o = { "name": "A1", "children": [ { "name": "B1", "children": [ { "name": "B1-C1", "children": [ { "name": "B1-C1-D1", "children": [ { "name": "B1-C1-D1-E1", "value": 30, "score": 0.8 }, { "name": "B1-C1-D1-E2", "value": 35, "score": 0.5 } ] }, { "name": "B1-C1-D2", "children": [ { "name": "B1-C1-D2-E1", "value": 31, "score": 0.4 }, { "name": "B1-C1-D2-E2", "value": 23, "score": 0.7 } ] } ] } ] } ]};function avgUp(object){ object.avgScore = 0;if(object.children){ for(child of object.children){ object.avgScore += avgUp(child); }object.avgScore = object.avgScore /Math.max(1,object.children.length); return object.avgScore;}else{return object.score;}}avgUp(o);console.log(JSON.stringify(o));
红糖糍粑
您可以使用递归函数:const obj = { "name": "A1", "children": [{ "name": "B1", "children": [{ "name": "B1-C1", "children": [{ "name": "B1-C1-D1", "children": [{ "name": "B1-C1-D1-E1", "value": 30, "score": 0.8 }, { "name": "B1-C1-D1-E2", "value": 35, "score": 0.5 } ] }, { "name": "B1-C1-D2", "children": [{ "name": "B1-C1-D2-E1", "value": 31, "score": 0.4 }, { "name": "B1-C1-D2-E2", "value": 23, "score": 0.7 } ] } ] }] }]}function getWithAverageScore(objToRecurse) { // If I have a score I am already done if (objToRecurse.score) { return objToRecurse; } // Otherwise, I get my children with their average score const children = objToRecurse.children.map(getWithAverageScore); return { ...objToRecurse, children, // And I set my scoreAvg to their average (score or scoreAvg) scoreAvg: children.reduce((total, { score, scoreAvg }) => total + (score || scoreAvg), 0) / children.length };}console.log(JSON.stringify(getWithAverageScore(obj), null, 2))