Задать вопрос
@justifycontent

Как это понять?

const x = (str) => {
  let arr = str.split(' ');
  return arr.reduce((acc, rec, index) => {
    return (typeof acc[rec] !== 'undefined')
      ? { ...acc, [rec]: acc[rec] + 1 }
      : { ...acc, [rec]: 1 }
  }, {});
}

console.log(x('aa bb cc aa bb aa'));


Эта конструкция выводит количество вхождений каждого элемента, не могли бы вы помочь разобрать этот алгоритм?
  • Вопрос задан
  • 566 просмотров
Подписаться 3 Простой 1 комментарий
Решения вопроса 1
theobroma
@theobroma
javascript developer (ReactJS)
1)let arr = str.split(' ');
Возьмет строку, в данном случае 'aa bb cc aa bb aa', разобьет на части используя пробел как разделитель. В результате получим:
let arr = ['aa', 'bb', 'cc', ' aa', 'bb', 'aa']
2) Следующий кусок кода просто произведет подсчет одинаковых частей.
return arr.reduce((acc, rec, index) => {
    return (typeof acc[rec] !== 'undefined')
      ? { ...acc, [rec]: acc[rec] + 1 }
      : { ...acc, [rec]: 1 }
  }, {});
Рассмотрим его подробнее. Начнем с аргументов:
acc – последний результат вызова функции, он же «промежуточный результат».
rec – текущий элемент массива, элементы перебираются по очереди слева-направо.
index – номер текущего элемента.

Что собственно происходит:
-typeof acc[rec] !== 'undefined' проверит есть ли в объекте 'acc' ключ 'rec'.
- и если мы уже встречали такой( например когда "aa", но уже во второй раз ), тогда изменить значение этого ключа прибавив 1.{ ...acc, [rec]: acc[rec] + 1 }
- если же такого ключа еще не было, то создадим его со значением 1, ибо он в первый раз попался{ ...acc, [rec]: 1 }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы