【问题标题】:Get a random id from an array that does not exist in two other arrays从其他两个数组中不存在的数组中获取随机id
【发布时间】:2022-01-24 16:20:58
【问题描述】:

我正在尝试根据一组非常明确的要求生成随机 ID。

有 3 个数组 itemsAvailableitemsSeenitemsTaken

itemsAvailable 看起来像这样:[{ id: 1, ... }, ...] 一个具有各种字段的对象数组,其他字段对于此功能而言无关紧要,我们只关心 id 字段。它是一个数字,即1 -> X,每出现一个项目,X 就增加 1。

itemsSeen 只是用户看到的 id 的数组,所以如果他们看到 1, 7, 16 的 id,它看起来像 itemsSeen = [1, 7, 16]

itemsTaken 也只是他们看到并选择采用的 id 的数组,例如 itemsTaken = [1, 16]。他们只能拿走 itemsSeen 中存在的物品。

函数开始时,根据itemsAvailable的长度生成一个随机id。每个项目的 id 将匹配其索引位置。

如果itemsSeenitemsTaken 包含随机id,则在itemsAvailable 的长度范围内生成一个新的id,直到它不在任一数组中。

当一个数字生成并显示给用户时,它应该被添加到itemsSeen 数组中。如果该项目被选中,则应将其添加到 itemsAvailable 数组。然后再次从itemsAvaialbe 获取随机物品。

code sandbox 我所拥有的。

【问题讨论】:

  • 请将代码添加到问题中。
  • "每个项目的 id 将匹配它的索引位置。" -- 数组索引从 0 开始,但你的 ID 从 1 开始。所以大概每个项目的 ID 将是它的索引 + 1。
  • 你让这变得比它需要的更复杂。将所有 ID 放入 itemsUnseen 数组中。选择这个数组的一个随机元素。从itemsUnseen 中删除元素并将其添加到itemsSeen
  • Barmar,实际项目的 ids 从 0 开始,这只是总体布局的模型。会尽快尝试并回复您!

标签: javascript arrays random


【解决方案1】:

感谢 Barmar 帮助简化解决方案。

我将实现更改为只使用两个数组,从第一个数组中选择一个随机项,将其删除,然后将其添加到第二个数组中。

var itemsAvailable = [];
var currentItem;

for (let i = 0; i < 25; i++) {
  itemsAvailable.push({ id: i });
}

var itemsSeen = [{ id: 3 }, { id: 7 }, { id: 16 }];

const getRandomId = (arr, length) => {
  var r = arr[Math.floor(Math.random() * length)];

  if (itemsSeen.includes(r)) {
    r = arr[Math.floor(Math.random() * length)];
  }

  return r;
};

const generateRandomId = () => {
  if (itemsAvailable.length === 0) {
    return;
  }
  var nextItem = getRandomId(itemsAvailable, itemsAvailable.length);
  itemsSeen.push(nextItem);
  itemsAvailable = itemsAvailable.filter((item) => item !== nextItem);
  currentItem = nextItem;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2014-06-19
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多