質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

556閲覧

JavaScriptでユニークな文字列を自動で作りたい

shimon11

総合スコア49

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2022/11/22 01:03

実現したいこと

JavaScriptでユニークな文字列を自動で作りたいです

該当のソースコード

JavaScript

1 // 文字列が配列で入っています 2 let some_string_lists = [ 3 'string-1', 4 'some-text', 5 ]; 6 let uniqueString; 7 some_string_lists.forEach((list) => { 8 if (list !== 'string-1') { 9 uniqueString = 'string-1'; 10 } else if (list !== 'string-2') { 11 uniqueString = 'string-2'; 12 } else if (list !== 'string-3') { 13 uniqueString = 'string-3'; 14 } 15 // 無限に続きます 16 });

some_string_listsにstring-{番号}の文字列がなかったらその次の番号の数字を入れてuniqueStringとして返すプログラムを作りたいです。

現状ですと手動で無限に続けるしかなくループを作ることは出来ないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/11/22 01:10

uniqueStringはただの変数なので上書きされれば常にユニークだと思いますが?
shimon11

2022/11/22 01:43

ありがとうございます uniqueStringはsome_string_listsの中から最大の数がついたユニークな値としたいです
guest

回答2

0

ベストアンサー

要素数から次の番号を決める方法

絶対に連番(番号がスキップされない)のであれば以下の方法でできます。

考え方

  • 正規表現と.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}

投稿2022/11/22 01:15

編集2022/11/22 05:12
Cocode

総合スコア2314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimon11

2022/11/22 01:27

早速ありがとうございます やはり要素の数 + 1だと連番で無かった場合に不都合が生じてしまいます。 string-番号という文字列だけに絞った配列の中の最大の番号を取得するのは実装しないほうが良いでしょうか 番号の箇所が004など予期しない数字の場合比べられないなど
Cocode

2022/11/22 02:24 編集

> string-番号という文字列だけに絞った配列の中の最大の番号 この条件が当初の質問では提示されておりませんでした。 可能であると思います。やってみます。
Cocode

2022/11/22 02:48

回答を更新しました。ご確認ください。
shimon11

2022/11/22 04:37

ありがとうございます 追加で質問大変恐縮なのですが、numbers配列から被らない一番小さな数を返す関数をご教授いていただくことは可能でしょうか let numbers = [1,2,3]; なら4を let numbers =[1,3,4,5] なら2を let numbers = [1,2,5] なら3を取得するようなことです
Cocode

2022/11/22 05:13

更新しました
shimon11

2022/11/22 05:40

度々の質問に回答していただき、ありがとうございます!
guest

0

とりあえずこんな感じですかね

javascript

1const some_string_lists = [ 2 'string-1', 3 'string-2', 4 'some-text_a', 5 'some-text_b', 6 'string-5', 7 'string-10', 8 'some-text_c', 9 ]; 10const unique_txt='string-'; 11const reg=new RegExp(`(?<=^${unique_txt})\\d+$`); 12const getNextNum=()=>Math.max(...some_string_lists.map(x=>reg.test(x)?Number(x.match(reg)[0]):-1))+1; 13some_string_lists.push(unique_txt+getNextNum()); 14console.log(some_string_lists);

投稿2022/11/22 02:42

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問