我有一个名为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
);
}
答案 0 :(得分:1)
每次想要移动元素时,您都不必更新可用的汽车数组 - 您可以在操作结束时更新它。我假设您将用户选择的汽车放入对象或地图中,以便您可以快速查看密钥是否存在。你可以:
因此在选项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 k
中isCarAvailable
的索引更新为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的解决方案。