プログラミング フロントエンド バックエンド

【Javascript】オブジェクトの配列から、キー重複するレコードをランダムに抽出する方法

スポンサーリンク

こんにちは!

今回は「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: '近藤' }]

ご参考になれば幸いです。

以上、お疲れさまでした〜🍵

スポンサーリンク

-プログラミング, フロントエンド, バックエンド
-

© 2022 エンジニア×ライフハック Powered by AFFINGER5