prototype.js の max,min がいまいち
体力が一番残ってるやつの名前が知りたいとき
[{name: "foo", hp:5}, {name: "bar", hp:3}, {name: "boo", hp:2}].max(function(x) {return x.hp}); 実行結果 5
HP5じゃなくてインデックス(この場合 0)か要素をよこせ。
ああ、こんなとき関数型言語ならfoldを使うのに。
(mzpのコメントを受けて修正)こういうとき、関数型言語ではfoldを使う。prototype.jsではinjectとして入っている。
[{name: "foo", hp:5}, {name: "bar", hp:3}, {name: "boo", hp:2}].inject({hp:-1},function(x,y) { return (x.hp > y.hp) ? x : y}).name;
でOK.
(foldはjavascript 1.8 でreduceという名前で入る)
配列の総和 1 + 2 + ... + 10 $A($R(1,10)).inject(0,function(x,y) {return x+y}); 階乗の計算 10! $A($R(1,10)).inject(1,function(x,y) {return x*y}); 配列のreverseだってできます $A($R(1,10)).inject([],function(x,y){x.unshift(y); return x}); 配列のmapだってできます function mymap(f,arr) { return arr.inject([],function(x,y){x.push(f(y)); return x}); } mymap(function(x) {return x * 2},$A($R(0,5)));