@devunion

Как правильно написать функцию в ФП стиле?

Стараюсь в работе все больше использовать функциональный подход. Непривычно, но плюсы перевешивают. Ввиду отсутствия опыта возникают тривиальные вопросы. Вот один из них. Есть массив объектов двух типов: `Word` `Separator`. К примеру, такой: [Word, Separator, Word, Separator, Separator, Word, Separator] или [Word, Separator, Word, Separator, Word] задача - получить хвост списка до предпоследнего слова. В первом примере это [Separator, Separator, Word, Separator] во втором - [Separator, Word]. В процедурном стиле все понятно. В функциональном - тоже как-нибудь напишу. Вопрос в том, как сделать красиво и правильно?

PS. Написал. Но уж очень как-то не очень...
this.words.reverse().reduce((accum, w) => {
            if (accum.wordsCount == 0) {
                if (w instanceof Word) {
                    accum.wordsCount += 1;
                }
                accum.tail = [w, ...accum.tail];
            } else if (accum.wordsCount == 1) {
                if (w instanceof Separator) {
                    accum.tail = [w, ...accum.tail];
                } else {
                    accum.wordsCount += 1;
                }
            }
            return accum;
        }, {tail: [], wordsCount: 0}).tail;
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
@ComradV
По-моему, много более понятен следующий код.
Здесь мы перед добавлением смотрим, является ли слово Word, если да, увеличиваем счетчик. Если он большой (болше или равен 2), то не добавляем, иначе добавляем. Добавляем в конец, ибо работает быстрее. Потом оборачиваем.
this.words.reduceRight((accum, w) => {
    acc.count += (current instanceof Word)?1:0;
    if(acc.count < 2){
      acc.words.push(current);
    }
    return acc;
  }
  , {words:[], count:0}).words.reverse();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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