You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:45:29