要素数から次の番号を決める方法
絶対に連番(番号がスキップされない)のであれば以下の方法でできます。
考え方
- 正規表現と
.fliter()
を使って、string-番号
という文字列だけに絞った配列を新規作成します。
- その配列の要素の数を数えます。
- 要素の数 + 1が、次の番号になります。
コード例
javascript
1const strArr = ['string-1', 'dummy', 'string-2', 'string-3', 'dummy dummy'];
2
3// 'string-番号'という文字列のみに絞る
4const numberedStrings = strArr.filter(str => str.match(/^string-\d+$/));
5console.log(numberedStrings); // ['string-1', 'string-2', 'string-3']
6
7// numberedStringsの要素数+1が次の番号
8const uniqueString = `string-${numberedStrings.length + 1}`;
9console.log(uniqueString); // 'string-4'
最大値から次の番号を決める方法
コメントにて、番号がスキップされることや、string-005
のように変則的な数字が使用される可能性があるということで、それらを考慮したコードです。
javascript
1const strArr = ['string-1', 'string-005', 'dummy', 'string-2', 'string-3', 'dummy dummy'];
2
3// 'string-番号'という文字列のみに絞る → 文字列の数字を数値化する
4const numbers = strArr.filter(str => str.match(/^string-\d+$/))
5 .map(str => Number(str.replace(/^string-/, ''))); // [1, 5, 2, 3];
6
7// 最大値を取得
8const maxNum = Math.max(...numbers); // 5
9
10// maxNum + 1が次の数字
11const uniqueString = `string-${maxNum + 1}`;
12console.log(uniqueString); // 'string-6'
スキップされた最小の数値を求める方法
追加質問文です。
javascript
1const strArr = ['string-1', 'string-005', 'dummy', 'string-2', 'string-3', 'dummy dummy'];
2
3// 'string-番号'という文字列のみに絞る → 文字列の数字を数値化する → 昇順に並び替える
4const numbers = strArr.filter(str => str.match(/^string-\d+$/))
5 .map(str => Number(str.replace(/^string-/, '')))
6 .sort((a, b) => a - b); // [1, 2, 3, 5]
7
8const minSkippedNum = getMinSkippedNum(numbers); // 4
9const uniqueString = `string-${minSkippedNum}`;
10console.log(uniqueString); // 'string-4'
11
12
13// 配列の中の、スキップされた最小の数値を戻す関数
14function getMinSkippedNum(numberArr) {
15 for (let i=0; i<numberArr.length; i++) {
16 const sequenceNum = i+1;
17 if (numbers[i] !== sequenceNum) return sequenceNum;
18 }
19}