似乎underscore.js的reduce方法假设'memo'值是标量,而Ruby将接受一般对象。这是一个错误,下划线的限制.js还是我搞砸了?
以下是Ruby 1.9.3中reduce的一个简单示例。
irb(main):020:0> a = [1, 1, 2, 2]
=> [1, 1, 2, 2]
irb(main):021:0> a.reduce([]) {|accum, nxt| accum.push(nxt)}
=> [1, 1, 2, 2]
以下是我认为使用_.js
的等效代码var _ =Underscore.load();
function tryReduce() {
var a = [1, 1, 2, 2]
var b = _.reduce(a, function(out, nxt) {
return out.push(nxt);
}, [])
Logger.log(b)
}
在Google Script中,代码以
炸弹TypeError: Cannot find function push in object 1. (line 6, file "tryingStuff")
然而,此代码运行并给出正确的结果,1006。
var _ =Underscore.load();
function tryReduce() {
var a = [1, 1, 2, 2]
var b = _.reduce(a, function(out, nxt) {
return out + nxt;
}, 1000)
Logger.log(b)
}
答案 0 :(得分:2)
问题是Array#push
会在每种语言中返回不同的值。虽然Ruby's会返回Array
本身,但JavaScript's会返回更新后的length
。
_.reduce()
可以使用Array
个备忘录,但您必须确保Array
是迭代器中返回的内容:
var b = _.reduce(a, function(out, nxt) {
out.push(nxt);
return out;
}, [])
否则,第一轮以Number
(length
)结束,下一轮投掷错误,因为Number#push
不存在。这是你提到的“标量”:
看起来underscore.js的reduce方法假定'memo'值是标量