JavaScriptでRuby(to_a)やPerlの範囲演算子のような関数の作り方

範囲演算子とは

左の値から右の値まで数えた値からなる配列を返します。

例えばPerlならmy @arr = (1..3);で配列[1, 2, 3]となり、Rubyなら(1..3).to_aで配列[1, 2, 3]となります。

JavaScriptには範囲演算子がない

便利な範囲演算子ですがJavaScriptには範囲演算子はありません。

そのため似たような機能の関数を作成して使用する必要があります。

JavaScriptで範囲演算子のような関数

JavaScriptで範囲演算子のような関数を作成する場合は'1..3'の部分は文字列にする必要があるため下記のようになります。

function range(n) {
  var arr = n.split('..');
  var start = parseInt(arr[0], 10);
  var stop = parseInt(arr[1], 10);
  if (start > stop) {
    throw new Error(start + ' is bigger than ' + stop);
  }
  var stop = stop || start;
  var len = Math.max(stop - start, 0);
  var r = Array(len);
  for (var i = 0; i <= len; i++, start++) {
    r[i] = start;
  }
  return r;
};

console.log(range('1..5'));
// => [ 1, 2, 3, 4, 5 ]

console.log(range('-2..3'));
// => [ -2, -1, 0, 1, 2, 3 ]

console.log(range('5'));
// => [ 5 ]

JavaScriptだと文字列の場合は必ず引用符で囲まなくてはならないため、1..3のような記法にこだわらなければ第1引数と第2引数を用いた関数にしたほうが良いでしょう。

この方法であれば、さらに第3引数にステップ数を追加して使い勝手をより良くすることができます。

function range(start, stop, step) {
  if (start > stop) {
    throw new Error(start + ' is bigger than ' + stop);
  }
  var stop = stop || start;
  var step = step || 1;
  var len = Math.max(Math.ceil((stop - start) / step), 0);
  var r = Array(len);
  for (var i = 0; i <= len; i++, start += step) {
    r[i] = start;
  }
  return r;
};

console.log(range(1, 5));
// => [ 1, 2, 3, 4, 5 ]

console.log(range(-2, 3));
// => [ -2, -1, 0, 1, 2, 3 ]

console.log(range(5));
// => [ 5 ]

console.log(range(2, 10, 2));
// => [ 2, 4, 6, 8, 10 ]