2016-11-10 3 views
1

У меня есть этот фрагмент javascript, и мне интересно, могу ли я рассчитать amount и users за один проход функции reduce?Могу ли я сделать эту функцию более кратким

root.children.forEach(function(v) { 

    v.amount = v.children.reduce(function(a, b) { 
     console.log(a); 
     return { 
      amount: a.amount + b.amount 
     } 
    }, { 
     'amount': 0 
    }).amount 

    v.users = v.children.reduce(function(a, b) { 
     console.log(a); 
     return { 
      users: a.users + b.users 
     } 
    }, { 
     'users': 0 
    }).users 

}) 
+0

Не могли бы вы объяснить, что делает этот код или добивается? Что такое «дети» и т. Д.? – Li357

+0

поэтому у каждого root.children есть дети снова? Поскольку v содержит объект children, и вы затем записываете v.children ... – Gerfried

+0

@AndrewLi - это часть более крупной функции, которая строит иерархический json-файл с входа csv – whytheq

ответ

1

Вы могли бы один Array#forEach петлю.

var root = { 
 
     children: [ 
 
      { children: [ 
 
       { amount: 2, users: 3 }, 
 
       { amount: 7, users: 5 } 
 
      ]} 
 
     ] 
 
    }; 
 

 
root.children.forEach(function(v) { 
 
    v.amount = 0; 
 
    v.users = 0; 
 

 
    v.children.forEach(function(a) { 
 
     v.amount += a.amount; 
 
     v.users += a.users; 
 
    }); 
 
}); 
 
console.log(root);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+2

этот код в настоящее время не работает - родители показываются как 0 – whytheq

+0

dv, пометьте комментарий? –

+0

Вы немного изменили код? теперь он работает нормально для меня - спасибо. Я, вероятно, воспользуюсь вашим решением, так как для js nooby, как и для меня, проще, чтобы моя голова! – whytheq

6

Да, вы можете сделать это, как показано ниже,

root.children.forEach(function(v) { 
    var obj = v.children.reduce(function(a, b) { 
     a.amount += b.amount; 
     a.users += a.users; 
    }, {'amount': 0, 'users' : 0 }); 
    v.amount = obj.amount; 
    v.users = obj.users; 
}); 
6

Похоже, что вы можете буквально сочетать эти два метода в одном:

root.children.forEach(function(v) {   
    var result = v.children.reduce(
     function(a, b) { 
      return { 
       amount: a.amount + b.amount, 
       users: a.users + b.users 
      }; 
     }, 
     { amount: 0, users: 0 } 
    ); //^Note that I left out the quotes there. In this case, they're optional. 

    v.amount = result.amount; 
    v.users= result.users; 
}); 
+0

Объединение - это то, что я думал, будет возможно - просто не знаю, основы js означали, что реализация была сложной! – whytheq

Смежные вопросы