如何用JavaScript创建指定长度且尾部重复的数组?求优化方案
优化尾部重复数组生成函数的方案
你的原实现存在明显的性能短板:每次循环都通过扩展运算符重新创建数组,会触发频繁的内存分配与数据拷贝,当目标数组长度较大时,性能下降会非常明显。下面提供几种更高效的优化方案:
方案一:利用fill+flat批量生成重复尾部
通过一次性生成所有重复的尾部数组再扁平化拼接,大幅减少数组创建次数:
const getArr = (arrayLength, patternLength, repeatedTailLength) => { // 生成初始模式数组 const pattern = Array.from({ length: patternLength }, (_, i) => i + 1); if (arrayLength <= patternLength) return pattern.slice(0, arrayLength); // 获取要重复的尾部片段 const tail = pattern.slice(-repeatedTailLength); const totalNeeded = arrayLength - patternLength; const fullRepeats = Math.floor(totalNeeded / repeatedTailLength); const remainder = totalNeeded % repeatedTailLength; // 批量生成重复尾部并扁平化,再拼接剩余部分 const repeatedTails = Array(fullRepeats).fill(tail).flat(); const finalTail = tail.slice(0, remainder); return [...pattern, ...repeatedTails, ...finalTail]; };
方案二:直接在结果数组上push(避免重复创建数组)
原代码每次循环都重新赋值result,本质是反复创建新数组。改为直接在原数组上push,减少不必要的内存操作:
const getArr = (arrayLength, patternLength, repeatedTailLength) => { const pattern = Array.from({ length: patternLength }, (_, i) => i + 1); if (arrayLength <= patternLength) return pattern.slice(0, arrayLength); const tail = pattern.slice(-repeatedTailLength); const totalNeeded = arrayLength - patternLength; const fullRepeats = Math.floor(totalNeeded / repeatedTailLength); const remainder = totalNeeded % repeatedTailLength; const result = [...pattern]; // 批量添加完整尾部片段 for (let i = 0; i < fullRepeats; i++) { result.push(...tail); } // 添加剩余的尾部元素 result.push(...tail.slice(0, remainder)); return result; };
方案三:直接计算每个位置的元素(内存最优)
如果需要生成超大数组,这种方法不需要任何中间数组,直接通过索引计算元素值,内存占用最低:
const getArr = (arrayLength, patternLength, repeatedTailLength) => { const tailStartIndex = patternLength - repeatedTailLength; return Array.from({ length: arrayLength }, (_, index) => { // 前patternLength个元素直接返回1~patternLength if (index < patternLength) { return index + 1; } // 计算当前索引在重复尾部中的偏移量,映射到原模式的尾部位置 const tailOffset = (index - patternLength) % repeatedTailLength; return tailStartIndex + tailOffset + 1; }); };
验证结果
调用getArr(27, 9, 4),三种方案都会输出和你原代码一致的结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 6, 7, 8, 9, 6, 7, 8, 9, 6, 7, 8, 9, 6, 7, 8, 9, 6, 7]
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

