Google Apps Script按属性和拆分数组:代码修正请求
问题分析与代码修正
你的代码存在几个关键问题导致结果不全:
- 函数内部硬编码了
arr和sumMax,直接覆盖传入参数,既让函数失去通用性,也固定了后续处理的数组范围。 - 使用
arr.unshift修改原数组,同时循环的n取的是初始数组长度,导致被放回数组的后续元素无法被遍历到。 - 循环结束后没有把最后剩余的
temp_subArr加入结果数组。
以下是修正后的代码:
function splitArrByDuration(arr, sumMax) { const splittedArr = []; let tempSubArr = []; let currentSum = 0; for (const item of arr) { const itemValue = item[1]; // 检查加入当前元素后是否超过sumMax if (currentSum + itemValue > sumMax) { // 先把当前临时数组存入结果 splittedArr.push(tempSubArr); // 重置临时数组和当前总和,存入当前元素 tempSubArr = [item]; currentSum = itemValue; } else { // 可以加入,直接添加并更新总和 tempSubArr.push(item); currentSum += itemValue; } } // 循环结束后,把最后剩余的非空临时数组加入结果 if (tempSubArr.length > 0) { splittedArr.push(tempSubArr); } Logger.log(splittedArr); return splittedArr; } // 调用示例 splitArrByDuration([["a", 2], ["b", 1], ["c", 2], ["d", 1]], 3);
修正逻辑说明:
- 用
currentSum实时记录临时数组的总和,避免每次调用sumAtIndex遍历计算,提升效率。 - 遍历原数组时不修改原数组,通过判断总和来决定是否拆分临时数组。
- 循环结束后处理最后一组未存入的元素,确保所有元素都被正确分组。
调用修正后的函数,输出会是预期的[[["a", 2], ["b", 1]], [["c", 2], ["d", 1]]]。
内容的提问来源于stack exchange,提问作者Thierry Andriatsilavoarison
相关产品推荐
相关产品推荐

