うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

javascriptのreverse関数をかっこよくする

スポンサーリンク

javascriptArray.prototype.reverse()は配列の要素を逆順に並べ替えます. 暇だったので,配列の一部だけ反転するような関数を作ってみました. ただでさえ,Array.prototype.reverse()の需要がなさそうなのに,一部だけ反転する場面は在るのでしょうか,と思いつつ,書いてみました.

ソース

コンパクト.

/**
 * 配列xのi番目からj番目までを反転させる
 */
function reverse(x, i, j) {
  var a = x.slice(i, j + 1).reverse();
  return x = x.slice(0, i).concat(a).concat(x.slice(j + 1));
}

解説

  • 2行目
  var a = x.slice(i, j + 1).reverse();

この部分では,x.sliceでi~jまでをとって,そいつらだけreverse()使って反転させます.

  • 3行目
  return x = x.slice(0, i).concat(a).concat(x.slice(j + 1));
配列xのiより前の部分配列 + 先ほど反転した配列a + xのjより後ろの部分配列

をやっているだけです.

ソースその2

ちなみに,引数が足りない時など困らないように,条件分岐を追加したソースも書きました. けっこう長ったらしい…

function reverse(x, i, j) {
  if (i === null || typeof i === 'undefined') {
    return x.reverse();
  }
  
  if (i >= x.length || i < 0) {
    return x;
  }

  if (j === null || typeof j === 'undefined') {
    return reverse(x, i, x.length - 1);
  }
  
  if (j >= x.length) {
    j = x.length - 1;
  } else if (j < i) {
    j = i;
  }

  var a = x.slice(i, j + 1).reverse();
  return x = x.slice(0, i).concat(a).concat(x.slice(j + 1));
}