Javascript 下划线JS:减少到数组中会导致累加器上出现未定义的方法错误
我的代码与此类似,我试图用它生成一个由三个子数组组成的数组:Javascript 下划线JS:减少到数组中会导致累加器上出现未定义的方法错误,javascript,arrays,underscore.js,reduce,Javascript,Arrays,Underscore.js,Reduce,我的代码与此类似,我试图用它生成一个由三个子数组组成的数组: 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*10
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}...]
]
但是,当我尝试执行代码时,它返回
无法读取未定义的属性push
。当我检查Chrome中的错误时,它会指向memo.push
行。代码对我来说似乎没问题,但我不知道我的错误在哪里。非常感谢您的帮助。reduce方法需要返回一些值,以便下一次迭代作为输入
如果您单步执行代码(将调试器
语句放在.reduce
之前),您可以看到它第一次成功,但在第二个循环中未定义备注
在这种情况下,您可能希望从reduce返回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],函数(memo,series){
if(系列长度){
备忘录推送图(系列,功能(s,i){
返回{
x:s,
y:i*100
};
}));
}
返回备忘录;
}, []);
控制台日志(coords)
您必须从reduce回调返回某个值,以成为新的累加器值。否则,在下一次迭代和最终结果中,memo
将返回为undefined
A返回备忘录
会解决这个问题,但是我觉得您实际上不想使用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};
});
});
我明白了!此外,为什么你建议MAP+FETCH ORDER?@凯文惠特克:因为这是你的函数实际上正在做的,并且它更具描述性:-没有丑陋的代码>推/ <代码>需要调用。你也可以考虑<代码> >链<代码>,而不是嵌套多个<代码> map < /代码>和<代码>过滤器< /代码>调用(我发现它更容易阅读)@ @ Sube:是的,我想过它(或者更好的缩进),但基本上这是个人的选择,我只是使用了与OP相同的非OOP风格。