score:1

Accepted answer

you can use a recursive function:

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

score:1

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

Related Query

More Query from same tag