簡體   English   中英

在Javascript中將隨機項目從一個數組移動到另一個數組

[英]Moving random items from one array to another in Javascript

我有一個名為availableCars的數組,它有大約 500 個元素。 用戶可以選擇其中的一些(比方說 200,隨機)並“保留”這些汽車。

因此,我需要 onclick 將所有這些選定的項目從availableCars數組移動到reservedCars數組。

迭代所有項目並進行splice以將它們從第一個數組中刪除並將元素推送到第二個數組似乎很復雜,但我不確定是否有更好和最佳的方法。

建議?

PS我想出的解決方案如下:

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

您不必每次想要將元素移出可用的cars 數組時都更新它——您可以在操作結束時更新它。 我假設您將用戶選擇的汽車放入對象或地圖中,以便您可以快速查看密鑰是否存在。 你可以:

  1. 遍歷可用的汽車,檢查汽車是否應該移動到保留的汽車數組中。 如果應該,將其推送到保留的汽車數組中。 如果沒有,請將其推回原始陣列。 循環結束后,將可用的汽車數組按其原始長度拼接。
  2. 創建另一個像“newAvailableCars”這樣的空數組,而不是將汽車推回原始數組,而是將它們推入這個數組。 循環結束后,將原始數組設置為這個新數組。

因此,在選項 1 中,您只需在最后拼接一次。 在選項 2 中,您重新分配變量以使用新數組。 以下代碼顯示了一個示例,其中包含 2 個用戶選擇的 5 輛車(比例差異為 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' ]

考慮使用長度等於availableCars布爾值創建另一個名為isCarAvailable數組。 然后,您可以避免對availableCars數組進行大量操作,例如刪除或添加元素,而是將isCarAvailablecar number k的索引更新為 1 表示 true(可用),否則更新為 0。

創建數組reservedCars[i][j] ,其中包含用戶 ID i (從 0 或 1 向上索引)和j作為保留的汽車數量。 初始化時:將 i 的最大值設置為可用汽車的數量( length(availableCars) ),將 j 設置為一個用戶 ID 可以保留的最大汽車數量。

如果您絕對需要移動項目,我建議使用列表而不是數組,因為它們更適合插入/刪除項目: Javascript 中的鏈表與數組

否則,我建議使用 Bent 的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM