我有一个数组数组,对象看起来像这样:

var data = [
[{'name':'John', 'value':2},
{'name':'Randy', 'value':4}
],

[{'name':'Sarah', 'value':10},
{'name':'Julie', 'value':10}
]
];


我想遍历每个数组并加value并将总计存储在数组中。我想到的是这样的:

function add(accumulator, a) {
    return accumulator + a;
}

var totals = [];

var yExtent = data.forEach(function(item) {
  item.forEach(function(jtem) {
    var subTotals = [];
    subTotals.push(jtem.value);
    return subTotals;
  })
  var localTotal = subTotals.reduce(add,0);
  totals.push(localTotal);
  return totals;
});

console.log(totals)


但是,这会导致错误:“未定义subTotals”



发生这种情况是因为subTotals与函数的其他部分不在同一范围内吗?如果是这样,我应该如何进行?我不能将var localTotal = subTotals.reduce(add,0);放在范围内,因为forEach()会过于频繁地计算它并给我错误的值。我应该如何修改此代码以将内部的forEach()计算返回到外部?

最佳答案

forEach用于副作用。您确实想使用转换功能而不是副作用来编写转换。首先,它将更短。其次,它会更清楚-您不希望有副作用,您想要一个纯粹的转换,您的代码将反映出这一点。使用相同的代码,但使用map会导致以下结果:

var totals = data.map(item => {
  var localTotal = item.map(datum => datum.value).reduce(add, 0);
  return localTotal;
});

10-05 20:35