こんにちは!
今回は「Javascriptで、オブジェクトの配列からキー重複するレコードをランダムに抽出する方法」についてお伝えしたいと思います。
サービスにおいて、出力をランダムにしたい時ってありませんか??
例えば、おすすめ商品をランダムに出力して、新規性を持たせたいなど...
こういった場合に参考になるかなと思います〜
オブジェクトの配列からキー重複するレコードをランダムに抽出する方法
ランダムに抽出するには、Math.random
関数を使います。
以下の具体例を元に説明します。
例はキー重複を含む配列から、重複するものをランダムで1件抽出して、新たに配列を作成しています。
// 元データ
const dataArr = [
{userId: 100, group: 1, name: '山田'},
{userId: 200, group: 2, name: '近藤'},
{userId: 300, group: 1, name: '小林'},
];
const duplicateObj = {};
// group別に一纏めにするため、groupをキー、valueに各データの配列に設定したオブジェクトを生成
for (const data of dataArr) {
// ※reduceを使った方がシンプルかもですが、分かりやすさ重視で書いています
const insertData = {
userId: data.userId,
group: data.group,
name: data.name,
};
if (duplicateObj[data.group]) {
duplicateObj[data.group].push(insertData);
} else {
duplicateObj[data.group] = [insertData];
}
}
const resultArr = [];
// 同一groupで重複していた場合、ランダムで1件を抽出する
for (const key of Object.keys(duplicateObj)) {
const sum = duplicateObj[key].length;
const index = Math.floor(Math.random() * sum);
resultArr.push(duplicateObj[key][index]);
}
console.log(resultArr);
// 出力は処理を実行するたび以下がランダムに出力される
// [{ userId: 100, group: 1, name: '山田' }, { userId: 200, group: 2, name: '近藤' }]
// または
// [{ userId: 300, group: 1, name: '小林' }, { userId: 200, group: 2, name: '近藤' }]
ご参考になれば幸いです。
以上、お疲れさまでした〜🍵