0

underscore.js の reduce メソッドは、'memo' 値がスカラーであると想定しているのに対し、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)
}

Googleスクリプトでは、コードは

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、各言語で異なる値を返すことです。RubyArrayはそれ自体を返しますが、JavaScriptは更新された を返しますlength

_.reduce()Arrayメモを扱うことができますが、がイテレータで返されるものであることを確認する必要がありArrayます:

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 に答える