0

underscore.js 的 reduce 方法似乎假定“备忘录”值是一个标量,而 Ruby 将接受一个通用对象。这会是一个错误,是 underscore.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)
}

在谷歌脚本代码炸弹

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)
}
4

1 回答 1

2

问题是Array#push在每种语言中返回不同的值。Ruby返回Array自身,而JavaScript返回更新后的length.

_.reduce()可以使用Array备忘录,但您必须确保 itArray是迭代器中返回的内容:

var b = _.reduce(a, function(out, nxt) {
   out.push(nxt);
   return out;
}, [])

否则,第一轮以Number(the length) 结束,下一轮将抛出错误,因为Number#push不存在。这是您提到的“标量”:

似乎 underscore.js 的 reduce 方法假定“备忘录”值是一个标量

于 2013-07-13T03:02:45.210 回答