IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

JavaScriptでsum, concat, maximum, inits, tails, ...

JavaScriptにはsumとか標準でないようですね。なにか見落としているのかな、、、。

  • 合計
var sum = function(xss){return xss.reduceRight(function(acc, v){return acc + v;},0);};
undefined
sum([1,2,3]);
6
  • 最大
var maximum = function(xss) {return xss.reduceRight(function(acc,v){return acc > v ? acc :v;});}
undefined
maximum([1,2,3]);
3
  • 連結(cancatとかぶるのでアンスコをつけた)
var concat_ = function(xss){return Array.concat.apply([], xss);};
undefined
concat_([[1],[2],[3]]);
Array [ 1, 2, 3 ]
  • 配列を先頭から順に配列としてとる
var inits = function(xss){return xss.reduceRight(function(acc, v){return [[]].concat(acc.map(function(v1){return [v].concat(v1);}))},[[]]);}
undefined
inits([1,2,3]);
Array [ Array[0], Array[1], Array[2], Array[3] ]
  • 配列を後ろから順に配列としてとる
var tails = function(xss){return xss.reduceRight(function(acc, v){return [[v].concat(acc[0])].concat(acc);},[[]])};
undefined
tails([1,2,3]);
Array [ Array[3], Array[2], Array[1], Array[0] ]
  • 配列の連続した部分をとる
var segs = function(xss){return concat_(tails(xss).map(inits));};
undefined
segs([1,2,3]);
Array [ Array[0], Array[1], Array[2], Array[3], Array[0], Array[1], Array[2], Array[0], Array[1], Array[0] ]
  • 配列の連続した部分の合計の最大値を求める
maximum(segs([2,-3,4,-1,3]).map(sum));
6