underscore.js减少错误?与Ruby不同的行为?

时间:2013-07-13 02:50:28

标签: javascript ruby underscore.js

似乎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)
}

1 个答案:

答案 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;
}, [])

否则,第一轮以Numberlength)结束,下一轮投掷错误,因为Number#push不存在。这是你提到的“标量”:

  

看起来underscore.js的reduce方法假定'memo'值是标量