JavaScript实现Slot Filling座位分配算法二次运行失效问题咨询
Slot Filling 座位分配算法问题排查
你的整体设计思路成立:用对象数组存储每个座位的编号和对应占用组ID、优先分配靠前的空闲座位、组离场后重置对应座位group为0即可回收,逻辑层面没有问题,调用失效是代码实现的逻辑错误导致的。
问题根因
- 数组拼接逻辑错误:代码中
const slice = Table.slice(Group)+[...fillSeats, ...slice]的拼接逻辑仅在首次调用、所有座位全空闲时生效。当已有座位被占用时,该逻辑会直接丢弃原数组前Group个座位的数据(包含已被其他组占用的座位),直接导致第二次调用后数据错乱。 - 排序回调不符合规范:
arr.sort((a, b) => a.seat > b.seat)的回调返回布尔值,而JS的Array.sort要求回调返回数字类型(正数/负数/0),该写法在不同JS引擎下可能出现排序结果异常。
修正后的实现
你可以直接遍历所有座位,仅更新需要分配的空闲座位的组ID即可,无需复杂的裁剪拼接,同时符合React状态更新的不可变要求:
const CleanTable = [{seat: 1, group: 0}, {seat: 2, group: 0}, {seat: 3, group: 0}, {seat: 4, group: 0}, {seat: 5, group: 0}]; function groupCalculator(Table, Group, Index) { const emptySpace = Table.filter(s => s.group === 0); // 空闲座位不足直接返回提示 if (Group > emptySpace.length) return "no Free Slots"; // 提取本次要分配的座位编号 const targetSeats = emptySpace.slice(0, Group).map(item => item.seat); // 遍历所有座位,仅修改本次分配的座位的组ID return Table.map(seat => { if (targetSeats.includes(seat.seat)) { return {...seat, group: Index}; } return seat; }) }
内容的提问来源于stack exchange,提问作者ambrecht-web
相关产品推荐
相关产品推荐

