忍者ブログ

ひつ(じのひよこが)プログラミングします。
お仕事や趣味で困ったこととか、何度も「あれ?どうだったかしら」と調べたりしたこととか、作ったものとか、こどものこととかを書きます
★前は週末定期更新でしたが今は不定期更新です

2024/05    04« 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  »06

歯抜け対応

これ、何する記事

歯抜けの実装方法が分からないという人がちょっと多いので解説記事。

歯抜けとは

歯抜けとは、番号が振られた0個以上のリストがある際に、次に追加するアイテムにどんな番号を付けるべきか決定するルールである。例えば、1番から開始するリストがあったとする。

Case 1

次のようなリストがある

  • Item-1
  • Item-2
  • Item-3

この場合、次に追加するべきアイテムは Item-4 である。

Case 2

次のようなリストがある

  • Item-1
  • Item-3
  • Item-4

この場合、次に追加するべきアイテムは Item-2 である。

Case 3

次のようなリストがある

  • Item-2
  • Item-3
  • Item-4

この場合、次に追加するべきアイテムは Item-1 である。

Case 4

次のようなリストがある

  • notItem-1
  • Item-2
  • Item-3

この場合、次に追加するべきアイテムは Item-1 である。

作り方

新しいフォルダ(n)の歯抜けを作る。

function generateNextTitle(list) {
  // アイテム名が形式に合致するか確認する。
  // 番号を取得するために (\d+) している。
  // 前後に余計なものが付いていないことを確認するために先頭に ^ 末尾に $ を付加
  var regexp = /^新しいフォルダ((\d+))$/;

  // 既存の番号を格納するための空配列
  var titleNumbers = [];

  list.forEach(function(v, i) {
    if(regexp.test(v)) {
      titleNumbers.push(Number(regexp.exec(v)[1]));
    }
  });
  titleNumbers = titleNumbers.sort();

  // 小さい順に並べ、歯抜けがあったら抜けた数字を適用
  for(var i = 0; i < titleNumbers.length; i++) {
    if(i + 1 !== titleNumbers[i]) {
      return "新しいフォルダ(" + (i+1) + ")";
    }
  }

  // 歯抜けが無かったら最大の数字 +1 を適用
  return "新しいフォルダ(" + (titleNumbers.length+1) + ")";
}

console.log(generateNextTitle(["新しいフォルダ(1)", "新しいフォルダ(2)", "新しいフォルダ(3)"]));
console.log(generateNextTitle(["新しいフォルダ(1)", "新しいフォルダ(4)", "新しいフォルダ(3)"]));
console.log(generateNextTitle(["_新しいフォルダ(1)_", "_新しいフォルダ(1)", "新しいフォルダ(2)", "新しいフォルダ(3)"]));
PR

コメント

ただいまコメントを受けつけておりません。

ブログ内検索

P R