配列から任意の数の組み合わせをすべて求める

配列 [1,2,3,4,5] からいずれか 2 つ(重複なし)を取得する時の例。

(function() {
  var base = [1,2,3,4,5];
  var num = 2;

  var combi = get_combi(base, num);
  console.log(combi);
})();

function get_combi(base, num, ary = [], idx = 0) {
  var result = [];
  for (var i = idx; i <= base.length - num; i++) {
    var newary = ary.concat(base[i]);
    if (num > 1) {
      var r = get_combi(base, num-1, newary, i+1);
      Array.prototype.push.apply(result, r);
    } else {
      result.push(newary);
    }
  }
  return result;
}

簡単にできるかと思ったら意外と難しくて2日間頭を悩ませました。
組み合わせの数が膨大になるとメモリがクラッシュするっぽいので改善の余地ありです。
いやー、再帰は頭が死ぬのであまり使いたくないですね。

husky + lint-staged で品質を保つ

リントツールをインストールしても使わなければ意味がない。

というわけで人的なリント忘れを未然に防ぐためにも、huskey と lint-staged と 各種リントツールを組み合わせてコミット前に自動的にリントが行われる環境を作りましょう。リントエラー時にコミットを弾くことによって git 上のコードの品質を保つことができます。

続きを読む