Почему Reduce закрывается до того, как завершает цикл по всему массиву, который передается? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь перебрать указанный массив и проверить, что повторяющихся имен нет.Если есть, добавьте число рядом с повторяющимся именем файла.Это мой код:

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)' ].

Я не уверен, почему он не заканчивает цикл между двумя последними элементами в массиве.

1 Ответ

0 голосов
/ 07 февраля 2019

Если элемент с добавленным номером все еще находится в accum, вы просто отбрасываете его, а не пытаетесь снова с увеличенным числом.Таким образом, два a, которые были бы преобразованы в 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;
  }, []);
}
...