Для достижения вашей цели функция sumup()
будет вызываться N раз.Мы не знаем, сколько это N, так как оно зависит от количества рекурсий для дочерних узлов.Кроме того, благодаря ограничениям, мы не можем редактировать сигнатуру функции и не можем писать код в другом месте, чтобы делать что-либо, даже не устанавливая сумму вручную в 0.
Поэтому нам нужен способ различатьнабор вызовов из NEXT связки и сбросьте его.
Моя идея состоит в том, что мы устанавливаем порог, используем замыкание .Начиная с первого вызова, в этом примере у вас есть 5 секунд времени для продолжения вызова, после чего он начнется заново.Это действительно все, что мы можем сделать, если не предусмотрен другой способ различения вызовов.
РЕДАКТИРОВАТЬ: То, что я пытался здесь, это сохранить все рекурсии как базовый вариант, а не изменять объект.Так как OP принял это решение, я добавляю свойство resetter узла.Если в каком-либо узле есть средство сброса, которое не определено, или ноль, или ноль, или не определено, это сбросит сумму.Мы должны предположить, что это не определено в запущенном объекте.Как я уже сказал, это довольно слабое предположение.Определяя его при повторении, текущая сумма переносится.Я также сохраню первоначальную идею о пороге времени для возможного интереса.
var obj = {
"value": 4,
"children": [
{
"value": 2,
"children": [
{
"value": 1
}
]
},
{
"value": 9
}
]
}
const sumup = (function(){
var lastTime = 0;
var newTime = 0;
var sum = 0;
const timeThreshold = 5000; // 5 seconds
return function(node) {
newTime = new Date().getTime();
if(!node["resetter"] || (newTime-lastTime >= timeThreshold)){
sum=0;
lastTime = newTime;
}
sum+=node.value;
if (node.children && node.children.length > 0) {
for (var i =0; i < node.children.length; i++) {
sumup(Object.assign({"resetter":true},node.children[i]));
}
}
return sum;
}
})();
console.log(sumup(obj)); //16
console.log(sumup(obj)); //32! should print 16 everytime