我有一个数组数组,对象看起来像这样:
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()
的计算返回到外部?
答案 0 :(得分:2)
forEach
用于副作用。您真的想使用转换功能而不是副作用来编写转换。首先,它将更短。其次,它会更清楚-您不希望有副作用,您想要一个纯粹的转换,您的代码将反映出这一点。使用相同的代码,但使用map
会导致以下结果:
var totals = data.map(item => {
var localTotal = item.map(datum => datum.value).reduce(add, 0);
return localTotal;
});
答案 1 :(得分:1)
您可能想要做类似的事情
function selectValue(item) {
return item.value;
}
const totals = data.map(
subList => subList.map(selectValue)
.reduce(add, 0)
);
答案 2 :(得分:1)
您需要像这样将subTotals的声明移到forEach循环之外-
此外,您不应该重复使用项目。
function add(accumulator, a) {
return accumulator + a;
}
var totals = [];
var yExtent = data.forEach(function(item) {
var subTotals = [];
item.forEach(function(subItem) {
var subs = [];
subTotals.push(subItem.value);
return subs;
})
var localTotal = subTotals.reduce(add,0);
totals.push(localTotal);
return totals;
});
console.log(totals)
这仍然会为您提供一个多维数组,因此您可能需要将控制台日志更改为console.log(totals.flat(2))。
或者您可能想添加数字。
答案 3 :(得分:0)
制作array.forEach函数是因为它不可能返回任何值。没有办法超越这种行为。这是他们在幕后所做的。因此,.forEach所能做的就是遍历一个数组并对存储在数组中的项目进行某些操作,例如console.log()它们等等。