Underscore JS:缩减为数组会导致累加器出现未定义的方法错误

Underscore JS: reducing into an array causes undefined method error on the accumulator

我有看起来与此类似的代码,我试图用它来生成一个由三个子数组组成的数组:

f = [1, 2.5, 3, 10]
p = [1.2, 5.1, 6.3, 11]
r = [1, 1, 1, 1]

coords = _.reduce([f, p, r], function(memo, series){
    if(series.length){
        memo.push(_.map(series, function(s, i){
            return {x: s, y: i*100};
        }));
    }
}, []);

console.log(coords);

最终结果应如下所示:

[
  [{x:1,y:100},{x:2,y:2.5}...],
  [{x:1,y:12},{x:2,y:51}...]
]

但是,当我尝试执行代码时,它 returns cannot read property push of undefined。当我检查 Chrome 中的错误时,它指向 memo.push 行。代码 似乎 对我来说没问题,但我不知道我的错误在哪里。感谢任何帮助。

_.reduce 方法需要 return 一些值,以便下一次迭代作为输入。

如果你单步执行代码(在_.reduce之前放一个debugger语句),你可以看到第一次成功了,但是第二次memo是未定义的循环。

在这种情况下,您可能希望从 reduce 中 return memo,无论您是否向其中添加了新元素(如果该系列为空,请继续进行下一个系列)。

类似于:

f = [1, 2.5, 3, 10]
p = [1.2, 5.1, 6.3, 11]
r = [1, 1, 1, 1]

coords = _.reduce([f, p, r], function(memo, series) {
  if (series.length) {
    memo.push(_.map(series, function(s, i) {
      return {
        x: s,
        y: i * 100
      };
    }));
  }
  return memo;
}, []);

console.log(coords);

您必须 return 来自 reduce 回调的内容才能成为新的累加器值。否则 memo 将在下一次迭代和最终结果中返回为 undefined

A return memo; 会解决这个问题,但我觉得你实际上不想使用 reduce:

var coords = _.map(_.filter([f, p, r], function(series) {
    return series.length; // > 0
}), function(nonemptyseries) {
    return _.map(nonemptyseries, function(s, i){
        return {x: s, y: i*100};
    });
});