JavaScript嵌套数组元素连续比较实现问题求助
问题分析
原代码的核心问题是内层循环条件错误:j < s[i].length 限制循环只能针对子数组的固定长度(2),导致大部分比较无法执行。另外,s.indexOf(s[i]) 获取索引存在风险(重复元素会返回错误索引),且原逻辑未处理最后一个元素与第一个元素的循环比较。
修正方案
只需要单循环遍历每个元素,通过(i+1) % s.length获取下一个元素的索引(实现循环比较),同时直接使用当前索引替代indexOf避免错误:
console.log(allocateRooms([[1,5], [2,4], [6,8], [7,7]])); function allocateRooms(c) { // 拷贝原数组并按到达时间排序,避免修改输入参数 let s = [...c].sort((a, b) => a[0] - b[0]); let rooms = []; // 遍历每个元素,与下一个元素(最后一个的下一个是第一个)比较 for (let i = 0; i < s.length; i++) { // 计算下一个元素的索引,实现循环比较 const nextIdx = (i + 1) % s.length; const depart = s[i][1]; const arrive = s[nextIdx][0]; if (depart >= arrive) { // 记录排序后的元素编号(从1开始计数) rooms.push(i + 1); rooms.push(nextIdx + 1); } else { rooms.push(0); } } return rooms; }
代码说明
- 用
[...c]拷贝原数组,避免修改输入的原始数据 (i+1) % s.length确保最后一个元素的下一个比较对象是第一个元素,完成循环比较- 直接使用
i和nextIdx获取元素位置,替代s.indexOf,避免重复元素导致的索引错误 - 循环覆盖所有需求的比较:
[1,5]与[2,4]、[2,4]与[6,8]、[6,8]与[7,7]、[7,7]与[1,5]
保留原数组编号的版本
如果需要记录原数组的元素编号(而非排序后的编号),可以在排序时保留原索引:
console.log(allocateRooms([[1,5], [2,4], [6,8], [7,7]])); function allocateRooms(c) { // 保留原数组的元素编号,再按到达时间排序 let s = c.map((item, idx) => ({...item, originalIdx: idx + 1})).sort((a, b) => a[0] - b[0]); let rooms = []; for (let i = 0; i < s.length; i++) { const nextIdx = (i + 1) % s.length; const depart = s[i][1]; const arrive = s[nextIdx][0]; if (depart >= arrive) { // 记录原数组的元素编号 rooms.push(s[i].originalIdx); rooms.push(s[nextIdx].originalIdx); } else { rooms.push(0); } } return rooms; }
内容的提问来源于stack exchange,提问作者Decodeme
相关产品推荐
相关产品推荐

