JS查找数组重复元素并按增量规则动态自动重命名的实现方法
数组重复元素自动增量重命名实现方案
正确实现代码
const renameDuplicateItems = (originalArr) => { // 记录每个元素的出现次数 const itemCounter = {} const resultArr = [] for (const item of originalArr) { if (!itemCounter[item]) { // 首次出现直接添加 resultArr.push(item) itemCounter[item] = 1 } else { // 重复出现拼接后缀 resultArr.push(`${item} ${itemCounter[item]}`) // 计数自增,下次重复后缀+1 itemCounter[item]++ } } return resultArr } // 测试用例 const _temparr = ["car","motor","bicycle","tricyle","motor"] console.log(renameDuplicateItems(_temparr)) // 输出结果:["car","motor","bicycle","tricyle","motor 1"]
方案说明
- 时间复杂度为O(n),仅需遍历一次数组即可完成处理,性能远高于双重循环方案
- 无需手动指定任何元素值,所有重复元素都会自动按照规则重命名,适配任意场景
- 每个元素独立计数,多个不同元素重复时不会互相干扰,比如输入
["car","motor","car","motor","car"]会输出["car","motor","car 1","motor 1","car 2"]
原代码问题说明
- 全局共用一个counter变量,没有按元素区分计数,多个不同元素重复时计数会完全混乱
- 判断条件硬编码为等于"motor",无法适配其他重复元素,且取
_newarr[i]时i是原数组的遍历索引,此时_newarr长度小于等于i,取值为undefined,判断永远不会触发 - 内层循环判断后就push元素,循环结束后又额外push一次原元素,会导致元素重复插入
内容的提问来源于stack exchange,提问作者Farid Arshad
相关产品推荐
相关产品推荐

