【问题标题】:Moving random items from one array to another in Javascript在Javascript中将随机项目从一个数组移动到另一个数组
【发布时间】:2017-10-24 13:38:15
【问题描述】:

我有一个名为 availableCars 的数组,它有大约 500 个元素。用户可以选择其中一些(假设是 200 个,随机)并“预订”这些汽车。

因此,我需要 onclick 将所有选定的项目从 availableCars 数组移动到 reservedCars 数组。

迭代所有项目并执行splice 以从第一个数组中删除它们并将元素推送到第二个数组似乎很复杂,但我不确定是否有更好和最佳的方法。

建议?

附:我想出的解决方案如下:

public moveCarsAround(selectedElements): void {
    // Add all selected elements to the reservedCars list.
    this.reservedCars = this.reservedCars.concat(this.availableCars.filter((car) =>
        selectedElements.indexOf(car.id) !== -1
    ));

    // Remove all selected elements from availableCars list.
    this.availableCars = this.availableCars.filter((car) =>
        selectedElements.indexOf(car.id) === -1
    );
}

【问题讨论】:

  • 您应该包含您当前的代码。
  • 好的。我现在加了。

标签: javascript arrays


【解决方案1】:

您不必在每次想要将元素移出时更新可用的汽车数组 - 您可以在操作结束时更新它。我假设您会将用户选择的汽车放入对象或地图中,以便您可以快速查看密钥是否存在。你可以:

  1. 遍历您的可用汽车,检查是否应将汽车移动到预留汽车阵列。如果应该,将其推入保留的汽车阵列。如果没有,请将其推回原始阵列。循环结束后,按照原始长度拼接可用的汽车数组。
  2. 创建另一个空数组,例如“newAvailableCars”,而不是将汽车推回原始数组,而是将它们推入这个数组。循环结束后,将原始数组设置为这个新数组。

因此,在选项 1 中,您只需在最后拼接一次。在选项 2 中,您重新分配变量以使用新数组。以下代码显示了 5 辆汽车和 2 个用户选择的示例(规模差异为 100 倍,但您应该能够很好地适应它)。它突出显示了第一种方法,并注释掉了第二种方法。

let availableCars = ['Car 1', 'Car 2', 'Car 3', 'Car 4', 'Car 5'];
let reservedCars = [];
let userPicks = {
  'Car 2': 1,
  'Car 4': 1
};

let length = availableCars.length;
// let newAvailableCars = []; // or use this

for (let i = 0; i < length; i++) {
  if (userPicks[availableCars[i]]) {
    reservedCars.push(availableCars[i]);
  } else {
    availableCars.push(availableCars[i]);
    // newAvailableCars.push(availableCars[i]); // with this
  }
}

availableCars.splice(0, length);
// availableCars = newAvailableCars; // and this

console.log(reservedCars);  // --> [ 'Car 2', 'Car 4' ]
console.log(availableCars); // --> [ 'Car 1', 'Car 3', 'Car 5' ]

【讨论】:

    【解决方案2】:

    考虑使用长度等于availableCars 的布尔值创建另一个名为isCarAvailable 的数组。然后,您可以避免对availableCars 数组执行大量操作,例如删除或添加元素,而是将isCarAvailable 中的car number k 的索引更新为1 为true(可用),否则为0。

    创建数组 reservedCars[i][j],其中包含用户 ID i(索引从 0 或 1 及以上)和 j 作为保留的汽车数量。初始化时:将 i 的最大值设置为可用汽车的数量(length(availableCars)),将 j 设置为一个用户 ID 可以保留的最大汽车数量。

    【讨论】:

      【解决方案3】:

      如果您绝对需要移动项目,我建议使用列表而不是数组,因为它们更适合插入/删除项目: Linked list vs Array in Javascript

      否则,我建议使用 Bent 的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2018-10-04
        • 1970-01-01
        • 2021-09-27
        • 2018-02-05
        相关资源
        最近更新 更多