JavaScript无法返回变量

时间:2019-05-17 01:18:31

标签: javascript

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

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()的计算返回到外部?

4 个答案:

答案 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()它们等等。