うめすこんぶ

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

javascriptの配列操作関数いろいろ作ってみた

スポンサーリンク

javascriptで,rubyの配列操作みたいなことをやりたかったので,いろいろなメソッドを作ってみました.名前は大体rubyから取ってきてます.簡単なメソッドばかりなのでソース書くのは苦労しません.間違いありましたらご指摘いただければ幸いです.

まとめ:

method description
collect(x, f) 配列xのすべての要素eについて,f(e)を適用した結果の配列を返す
rotate(x, n) 配列xを左にn個ずらす。(前n個の要素を後ろに置く)
zip(x, y) 配列x,yの2つをまとめた配列を返す
take(x, n) 配列xのn番目より前の部分配列を取得する
drop(x, n) 配列xのn番目以降の部分配列を取得する
uniq(x) 配列xの重複を排除する
isUniq(x) 重複した要素がなければば真を返す
index(x, e) 配列x中の要素eと同じもののインデックスを返す
select(x, f) 配列x中の,条件式関数fによってf(e)が真となる要素eからなる配列を返す
reject(x, f) 配列x中の,条件式関数fによってf(e)が偽となる要素eからなる配列を返す

ソース

/**
 * 配列xのすべての要素eについて,f(e)を適用した結果の配列を返す
 */
function collect(x, f) {
  var a = [];
  for (var i = 0, len = x.length; i < len; i++) {
    a.push(f(x[i]));
  }
  return a;
}

/**
 * 配列xを左にn個ずらす。(前n個の要素を後ろに置く)
 */
function rotate(x, n) {
  return x.slice(n - 1).concat(x.slice(0, n));
}

/**
 * 配列x,yの2つをまとめた配列を返す
 */
function zip(x, y){
  var l = x.length > y.length ? y.length : x.length;
  var a = new Array(l);
  for (var i = 0; i < l; i++) {
    a[i] = [x[i], y[i]];
  }
  return a;
};

/**
 * 配列xのn番目より前の部分配列を取得する
 */
function take(x, n){
  var a = [];
  for (var i = 0, l = n; i < l; i++) {
    a.push(x[i]);
  }
  return a;
};


/**
 * 配列xのn番目以降の部分配列を取得する
 */
function drop(x, n){
  var a = [];
  for (var i = n, l = x.length; i < l; i++) {
    a.push(x[i]);
  }
  return a;
};

/**
 * 配列xの重複を排除する
 */
function uniq(x){
  for (var i = 0; i < x.length; i++) {
    for (var j = x.length; j > i; j--) {
      if (x[i] === x[j]) x.splice(j, 1);
    }
  }
  return x;
};

/**
 * 重複した要素がなければば真を返す
 */
function isUniq(x) {
  for (var i = 0, l = x.length; i < l; i++) {
    for (var j = i + 1; j < l; j++) {
      if (x[i] === x[j]) return false;
    }
  }
  return true;
}

/**
 * 配列x中の要素eと同じもののインデックスを返す
 * ない場合は-1を返す
 */
function index(x, e){
  for (var i = 0, l = x.length; i < l; i++) {
    if (x[i] === e) {
      return i;
    }
  }
  return -1;
};

/**
 * 配列x中の,条件式関数fによってf(e)が真となる要素eからなる配列を返す
 */
function select(x, f){
  var a = [];
  for (var i = 0, l = x.length; i < l; i++) {
    if (f(x[i])) {
      a.push(x[i]); 
    }
  }
  return a;
};


/**
 * 配列x中の,条件式関数fによってf(e)が偽となる要素eからなる配列を返す
 */
function reject(x, f){
  var a = [];
  for (var i = 0, l = x.length; i < l; i++) {
    if (!f(x[i])) {
      a.push(x[i]); 
    }
  }
  return a;
};