JavaScript | 文字列をランダムに並び替える(シャッフルする)方法

JavaScript 文字列,JavaScript

JavaScript | 文字列をランダムに並び替える(シャッフルする)方法

JavaScriptで文字列を一文字単位でランダムに並び替える、シャッフルする方法を紹介しています。

JavaScriptにはshuffle関数はないので、用途に合わせてコードを書くか、配列やオブジェクトのランダムな並び替えが可能な機能があるライブラリを使う方法になるかと思います。

文字列をランダムに並び替える

文字列をランダムに並び替えるJavaScriptサンプルコードです。

ネット上には多くのシャッフル関連のサンプルコードが紹介されていますが、今回は並び替え用に新しいオブジェクト型(連想配列)を作成して、ランダムに生成した数値のキー名と文字列の一文字ずつを値としてデータ化。

キー名が数値の場合、少ない順にソートされますので最後にjoin()でオブジェクトの値のみを連結して文字列に戻しています。

function shuffle(text) {
	let obj = {};

	// 受け取った文字列を文字数分繰り返す
	for (let i = 0; i < text.length; i++) {

		// ランダムな数値を生成する ※文字数より少ないと永久ループする
		let rand = Math.floor(Math.random() * 10000000);

		// 同じキー名がないか判別する
		if (!obj[rand]) {
			// 同じキー名がない場合にobjに追加する
			obj[rand] = text[i];
		} else {
			// 同じキー名ある場合、やり直す
			i--;
		}

	}

	// 作成したオブジェクトの値のみを区切り文字なしで連結する
	return Object.values(obj).join('');
}

let text = 'abcdefghijklmn';
text = shuffle(text);

console.log(text);
// dlgibeacjhfkmn

※生成する乱数を大きな桁数にしておけば、同じ値が出てくる可能性は限りなく低くなりますが、for文の途中でもし乱数が既に生成されたものの場合に重複を避けるため、同じiで処理するようにi–を記述しています。
こういう時、for ofで記述するにはどうすれば良いか、知りません。

オブジェクトの値のみをjoin()関数で連結して文字列にするにはObject.values()を利用します。

Object.values(obj).join('');