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次 - 限制:数组没有多余预分配空间时,不允许额外扩展数组长度
实现思路
这里推荐用双指针反向填充的方案,避免正向填充时频繁移动元素导致的性能损耗,同时能很好的适配空间限制要求:
- 先遍历一次数组,计算出符合规则的元素总数量
- 拿计算出的总数量和数组最大允许长度对比,取较小值作为最终数组的长度,满足不能随意扩展空间的要求
- 用两个指针分别指向原数组末尾和最终结果数组的末尾,从后往前逐个填充元素,遇到需要重复的元素就填充对应次数,直到所有位置填完
参考代码
/** * 按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.
相关产品推荐
相关产品推荐

