首页 > 解决方案 > 有没有办法从包含特定值的对象中找到()随机元素

问题描述

我有一个包含健身房及其可用设备的对象:

        const gyms = [
  {
    "name": "gym1",
    "equipmentAvailable": ["nothing"]
  },
  {
    "name": "gym2",
    "equipmentAvailable": ["jump rope","stationary bike","barbell"]
  },
  {
    "name": "gym3",
    "equipmentAvailable": ["kettlebell","dumbbell"]
  },
  {
    "name": "gym4",
    "equipmentAvailable": ["barbell","kettlebell","jump rope"]
  }
]

我还列出了下一次锻炼所需的设备清单(然后转换为套装):

const availableNeeded = ["barbell","jump rope"]

const equipmentSet = new Set(availableNeeded);

目前我正在使用 .find() 拉出第一个符合我的设备需求的健身房:

const filteredWorkouts = gyms.find(workout => (
  workout.equipmentAvailable.some(equipment => equipmentSet.has(equipment))
))

console.log(filteredWorkouts)

自然,这总是返回gym2,因为它是第一个匹配所需设备的健身房。但是,有时我想将其切换到gym4,因为它有所需的设备,但 find() 不会提供。

我如何随机化健身房输出,以便它可以吐出gym2gym4?

标签: javascript

解决方案


使用.filter而不是.find获取可能匹配的数组,然后从数组中获取随机元素:

const gyms = [
  {
    "name": "gym1",
    "equipmentAvailable": ["nothing"]
  },
  {
    "name": "gym2",
    "equipmentAvailable": ["jump rope","stationary bike","barbell"]
  },
  {
    "name": "gym3",
    "equipmentAvailable": ["kettlebell","dumbbell"]
  },
  {
    "name": "gym4",
    "equipmentAvailable": ["barbell","kettlebell","jump rope"]
  }
];
const availableNeeded = ["barbell","jump rope"];
const filteredWorkouts = gyms.filter(gym => (
  availableNeeded.every(equip => gym.equipmentAvailable.includes(equip))
));
const result = filteredWorkouts[Math.floor(Math.random() * filteredWorkouts.length)];
console.log(result);


推荐阅读