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

JS如何按数组项repeat属性在指定位置重复对应次数的元素

数组按repeat属性重复元素实现方案

需求规则

输入结构如下的对象数组:

let inputArr = [
  {name: "Milos", repeat: null},
  {name: "Milos1", repeat: 2},
  {name: "Milos2", repeat: null},
  {name: "Milos3", repeat: 4},
  // 更多元素
];

需要按照每个元素的repeat属性处理:

  • 若repeat为有效正整数,将该元素在对应位置重复n次(n等于repeat的值)
  • 若repeat为null,仅保留原元素1次
  • 限制:数组没有多余预分配空间时,不允许额外扩展数组长度

实现思路

这里推荐用双指针反向填充的方案,避免正向填充时频繁移动元素导致的性能损耗,同时能很好的适配空间限制要求:

  1. 先遍历一次数组,计算出符合规则的元素总数量
  2. 拿计算出的总数量和数组最大允许长度对比,取较小值作为最终数组的长度,满足不能随意扩展空间的要求
  3. 用两个指针分别指向原数组末尾和最终结果数组的末尾,从后往前逐个填充元素,遇到需要重复的元素就填充对应次数,直到所有位置填完

参考代码

/**
 * 按repeat规则处理数组
 * @param {Array} originArr 原始输入数组
 * @param {Number} maxLength 数组最大允许长度,不能扩展时传原始数组预分配长度即可
 * @returns {Array} 处理后的结果数组
 */
function processRepeatArray(originArr, maxLength) {
  // 计算所需总长度
  let needTotal = 0;
  for (const item of originArr) {
    needTotal += (Number.isInteger(item.repeat) && item.repeat > 0) ? item.repeat : 1;
  }
  const finalLen = Math.min(needTotal, maxLength);
  const result = new Array(finalLen);
  let resIdx = finalLen - 1;
  let originIdx = originArr.length - 1;

  while (resIdx >= 0 && originIdx >= 0) {
    const current = originArr[originIdx];
    const repeat = (Number.isInteger(current.repeat) && current.repeat > 0) ? current.repeat : 1;
    // 填充对应次数,剩余空间不足时直接停止
    for (let i = 0; i < repeat && resIdx >= 0; i++) {
      // 若需要深拷贝元素可替换为 structuredClone(current)
      result[resIdx] = { ...current };
      resIdx--;
    }
    originIdx--;
  }
  return result;
}

// 测试示例
const input = [
  {name: "Milos", repeat: null},
  {name: "Milos1", repeat: 2},
  {name: "Milos2", repeat: null},
  {name: "Milos3", repeat: 4}
];
// 假设数组最大允许长度为10
console.log(processRepeatArray(input, 10));

如果你不需要保留原数组,也可以直接在原数组上修改,不需要额外开辟新数组空间,空间复杂度可以降到O(1)。

内容的提问来源于stack exchange,提问作者Milos N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:04