シェル芸ならぬワンライナー芸@JavaScriptで色々やってみようという試みです。
今回はテストデータを作るときに役に立つかもしれない「任意長のランダムな文字列を作る」というのをやってみます。
「ランダムな文字列を作る」というのをざっと調べるとよく見つかるコードにこんなのがあります。
Math.random().toString(36).slice(-8);
- 乱数を発生させます。
- それを36進数としてパースすれば
0~9a~z
で値が表現されます。 - そのままでは先頭に
0.
というのが付いてしまうのでお尻から使えるところを拾っています。
都合の良いワンライナーですので、ここから発展させてみたいと思います。
0.
を捨てる
Math.random().toString(36).split('.')[1];
- ピリオドで分割します。
- 後ろを拾います。
もっと長くしたい
このままでは得られる文字列の長さに限界があるので適当に繋げてみます。
先ずは4つぐらいかな...
[0,1,2,3].map(() => Math.random().toString(36).split('.')[1]).join('');
- 先程の文字列を返すアロー関数を用意します。
- 4つの要素を持つ適当な配列から
map
メソッドで文字列を配列化します。 -
join
で連結して1つの文字列にします。
任意長にしたい
この方法で任意長にするためには配列の要素数を適切に設定する必要があります。
そのためには1回で得られる文字列の長さを把握しておきたいものです。
試しにこんな事をしてみますと...
for (let i = 0; i < 8; i++) console.log(Math.random().toString(36));
結果が
0.tss9ygi8yk7
0.cbl7c75unf
0.oi3ntqpk9f
0.3u3sulrw5ig
0.ph9gzmq637c
0.2pn7h79139
0.eqdmmpp0kyg
0.q1zz93b8csc
少なくとも10桁は使えそうです。
念の為、9桁使うという想定で進めます。(小心者)
欲しい長さを変数len
で与えたとして必要な要素数の配列を得るには...
[...Array(Math.ceil(len/9))]
- 欲しい長さを一度に得られる文字数で割ります。
- 切り上げで整数化します。
- 便利なオマジナイで配列を生成します。
これを予め作っていたコードに適用してみます。
[...Array(Math.ceil(len/9))].map(() => Math.random().toString(36).split('.')[1]).join('').slice(-len);
- 必要な長さを十分に満たす文字列を作ります。
- 与えられた長さを切り出します。
長さ0
以下を指定された場合の対策
このままでは長さに0
を指定されると都合が悪いので、その場合は長さ0
の文字列を返すことにします。
const randomString = (len) => len > 0 ? [...Array(Math.ceil(len/9))].map(() => Math.random().toString(36).split('.')[1]).join('').slice(-len) : '';
結果
出来上がりました。
動かしてみましょう。
const randomString = (len) => len > 0 ? [...Array(Math.ceil(len/9))].map(() => Math.random().toString(36).split('.')[1]).join('').slice(-len) : '';
for (let i = -1; i < 20; i++) console.log(randomString(i))
結果は
f
in
bso
2qz6
6ywe9
1hdq1r
a7nxjoa
yaamsm56
0mu9x06ft
5vogkds05g
e49k52cmq1m
l9lqg4npbdag
mtlygyh0dntn5
zkvbccv93eqbcg
0ywlv1k5wq9fj6q
k8amki0fo5de4r4h
vn05f4lic4ls3z3jd
knmcn6l5nex6xflnvk
c0h63fzghj9rfkq97qo
狙い通りです。
めでたしめでたし