@R0_none
ни ноты без банкноты

Как заменить for на reduce?

Есть такой код:

const rX = 'xX';
const rO = 'oO';
let rCountX = 0;
let rCountO = 0;

for (let i = 0; i < str.length; i++) {
  if (rX.includes(str[i])) {
    rCountX++;
  } else if (rO.includes(str[i])) {
    rCountO++;
  }
}
rCountX === rCountO ? true : false;

Хочу его укоротить, заменив for на reduce.
Но начинаю тормозить на моменте, а где в редюс разместить rCountX и rCountO?
  • Вопрос задан
  • 222 просмотра
Решения вопроса 2
WblCHA
@WblCHA
const rCount = Array.prototype.reduce.call(str, (acc, letter) => {
    if (rX.includes(letter)) {
      acc.X++;
    } else if (rO.includes(letter)) {
      acc.O++;
    }
    return acc;
  }, { X: 0, O: 0 });


Но, поскольку это явно крестики-нолики, то можно реализовать куда как красивее.
const rCount = Array.prototype.reduce.call(str.toLowerCase(), (acc, letter) => {
    switch(letter) {
      case 'x':
        acc.X++;
        break;
      case 'o':
        acc.O++;
        break;
    }
    return acc;
  }, { X: 0, O: 0 });
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const { x: countX = 0, o: countO = 0 } = Array
  .from(str.toLowerCase())
  .reduce((acc, n) => (acc[n] = (acc[n] ?? 0) + 1, acc), {});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
https://developer.mozilla.org/ru/docs/Web/JavaScri... - функция для работы с массивами, тогда как rX, rO - строки. Преобразуй их в массивы и используй reduce, если хочется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы