TypeScript:シードデータ生成などで使える便利関数
November 3, 2021
ダミーデータを作る際、基本的には何らかのライブラリを使うことが多いのではないでしょうか。
私はよく Faker.js を利用しています。
- Marak/faker.js: generate massive amounts of realistic fake data in Node.js and the browser
- https://github.com/marak/Faker.js/
上記以外にも、ダミーデータを弄る必要がある時によく使う自作の便利関数がありますので、今回はそちらをご紹介です。
ランダムな 8 桁の 文字列(Password) を生成する。 #
const getPassword = () => {
return Math.random().toString(36).slice(-8);
};
実行結果
const result = getPassword(); // e.g. '9yx1azmd'
指定した範囲の中でランダムな整数を生成する #
const getRandomInt = (startAt: number, endAt: number) => {
return Math.floor(Math.random() * (endAt - startAt + 1)) + startAt;
};
実行結果
const res1 = getRandomInt(3, 9); // e.g. 4
const res2 = getRandomInt(3, 9); // e.g. 7
startAt
以上 endAt
以下になります。上記の実行例だと結果は3〜9のいずれかです。
配列から指定した個数の要素を重複なくランダムに取り出す #
const pickupRandomly = <T>(array: readonly T[], amount: number = 1): T[] => {
const quantity = Math.min(amount, array.length);
const copiedArray = [...array];
const pickedItems = [];
for (let i = 0; i < quantity; i++) {
const pickedIndex = Math.floor(Math.random() * copiedArray.length);
const pickedItem = copiedArray.splice(pickedIndex, 1)[0];
pickedItems.push(pickedItem);
}
return pickedItems;
};
実行結果
const friends = ['alice', 'bob', 'charlie'];
const res1 = pickupRandomly(friends); // e.g. ['bob']
const res2 = pickupRandomly(friends, 2); // e.g. ['charlie', 'alice']
指定した時間を加算・減算した日時を生成する #
const addHour = (date: Date, hour: number) => {
const newDate = new Date();
return new Date(newDate.setHours(date.getHours() + hour));
};
const subHour = (date: Date, hour: number) => {
const newDate = new Date();
return new Date(newDate.setHours(date.getHours() - hour));
};
実行結果
const date = new Date(); // e.g. "2021-11-01T06:25:50.105Z"
const addedDate = addHour(date, 3); // e.g. "2021-11-01T09:25:50.105Z"
const subedDate = subHour(date, 3); // e.g. "2021-11-01T03:25:50.105Z"
setHours()
と getHours()
を変えることで加減する対象を変えることができます。
setDate()
とgetDate()
で日を加減setMonth()
とgetMonth()
で月を加減
Date オブジェクトの月や日をゼロ埋めして取得する #
const getMonth = (date: Date) => {
return (date.getMonth() + 1).toString().padStart(2, '0');
};
const getDate = (date: Date) => {
return date.getDate().toString().padStart(2, '0');
};
const getHour = (date: Date) => {
return date.getHours().toString().padStart(2, '0');
};
実行結果
const date = new Date(); // e.g. "2021-11-01T06:25:50.105Z"
const month = getMonth(date); // e.g. "11"
const date = getDate(date); // e.g. "01"
const hour = getHour(date); // e.g. "06"
Date オブジェクトを yyyy-mm-dd の形式で取得する #
const formatDate = (date: Date) => {
const year = date.getFullYear().toString().padStart(4, '0');
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
};
実行結果
const date = new Date(); // e.g. "2021-11-01T06:25:50.105Z"
const formatedDate = formatDate(date); // e.g. "2021-11-01"