按maxPushLimit与alreadyPushed差值推送数组元素结果错误如何修复
问题原因
你代码的核心错误是对Array.slice()方法的参数理解有误:slice(startIndex, endIndex)的第二个参数是截取的结束下标,不是你要截取的元素长度。
你第一次处理id=1的条目时,array2Index初始为0,limit=220,所以slice(0,220)刚好能取到220个元素,看起来运行正常。但处理完后array2Index变成了220,处理id=2的条目时limit=120,你写的slice(220,120)起始下标大于结束下标,自然返回空数组。
修正方案
你需要计算本次实际能截取的结束下标:应该是当前array2Index加上本次最多能放的数量,同时还要判断不能超过array2的总长度,避免取到空元素,也能同时满足你提到的两个特殊约束条件。
修正后的代码如下:
const array1 = [ { id: 1, alreadyPushed: 500, }, { id: 2, alreadyPushed: 600, }, { id: 3, alreadyPushed: 700, }, { id: 4, alreadyPushed: 720, }, ]; const array2 = []; for (let i = 1; i < 361; i++) { array2.push(i); } const maxPushLimit = 720; let results = []; let array2Index = 0; for (let i = 0; i < array1.length; i++) { // array2元素全部分配完直接终止循环,无需遍历后续条目 if (array2Index >= array2.length) break; const array1Item = array1[i]; const maxCanPush = maxPushLimit - array1Item.alreadyPushed; if (maxCanPush <= 0) continue; // 实际推入数量取「当前条目最大可推入量」和「array2剩余元素量」的较小值,兼容两种约束场景 const actualPushCount = Math.min(maxCanPush, array2.length - array2Index); const endIndex = array2Index + actualPushCount; array1Item.array2Items = array2.slice(array2Index, endIndex); array2Index = endIndex; results.push(array1Item); } console.log(results);
运行效果
修正后三个符合条件的条目将分别拿到220、120、20个元素,总和刚好等于array2的总长度360,完全符合预期输出。
内容的提问来源于stack exchange,提问作者Cedric Hadjian
相关产品推荐
相关产品推荐

