首页 > 解决方案 > 为什么 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)' ].

我不确定为什么它没有完成对数组中最后两个元素的循环。

标签: javascriptarraysreduce

解决方案


如果在 中仍然找到带有添加编号的元素accum,您只需将其删除,而不是使用增加的编号再次尝试。所以这两个as 将被转换为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;
  }, []);
}

推荐阅读