在Javascript中将随机项从一个数组移动到另一个数组

时间:2017-10-24 13:38:16

标签: javascript arrays

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

因此,我需要点击将所有选定项目从availableCars数组移至reservedCars数组。

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

建议?

P.S。我想出的解决方案如下:

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
    );
}

3 个答案:

答案 0 :(得分:1)

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

  1. 通过您的可用汽车进行迭代,检查汽车是否应该移动到预留的汽车阵列。如果应该,将它推入预留的汽车阵列。如果没有,请将其重新推回原始阵列。循环结束后,将可用的汽车阵列拼接原始长度。
  2. 创建另一个空数组,例如" newAvailableCars"而不是将汽车推回原来的阵列,将它们推入这个阵列。循环结束后,将原始数组设置为新数组。
  3. 因此在选项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' ]
    

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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