javascript - 为什么 Reduce 会在它完成对传入的整个数组的循环之前关闭?
问题描述
我正在尝试遍历给定的数组并检查是否没有重复的名称。如果有,请在重复的文件名旁边添加一个数字。这是我的代码:
const renameFiles = (arr) => {
let n = 1;
return arr.reduce((accum, element) => {
if (!accum.includes(element)) accum.push(element);
else {
element = `${element}(${n})`;
n++;
if (!accum.includes(element)) accum.push(element);
}
return accum;
}, []);
}
给出时:
renameFiles([
'a(1)',
'a(6)',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
'a',
]);
我只得到
[ 'a(1)', 'a(6)', 'a', 'a(2)', 'a(3)', 'a(4)', 'a(5)', 'a(7)', 'a(8)', 'a(9)' ]
代替:
[ 'a(1)', 'a(6)', 'a', 'a(2)', 'a(3)', 'a(4)', 'a(5)', 'a(7)', 'a(8)', 'a(9)', 'a(10)', 'a(11)' ].
我不确定为什么它没有完成对数组中最后两个元素的循环。
解决方案
如果在 中仍然找到带有添加编号的元素accum
,您只需将其删除,而不是使用增加的编号再次尝试。所以这两个a
s 将被转换为a(1)
并a(6)
从输出中删除。您可以使用
function renameFiles(arr) {
let n = 1;
return arr.reduce((accum, element) => {
let suffix = "";
while (accum.includes(element+suffix)) {
suffix = "(" + n + ")";
n++;
}
accum.push(element+suffix);
return accum;
}, []);
}
推荐阅读
- javascript - mocha如何执行目录下的测试文件?
- c - 处理多个 TCP 客户端
- javascript - Jquery 到 Vanilla Javascript 获取属性数据
- javascript - 如何在角度应用程序的文本区域中显示超链接
- javascript - 为什么继承的类比 pixi.js 上的实际精灵对象慢?
- android - 从 android 活动类创建反应原生模块
- raspberry-pi - Rook-Ceph 部署:创建 csi-cephfsplugin-provisioner 和 csi-rdb-plugin-provisioner 时出错
- c - 如何使用 inotify 实例同时监控两条路径?
- java - 我可以在安装应用程序时做些什么吗?
- mysql - 如果第二个表匹配条件,我如何查询 2 个表并返回结果