@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;
  • Вопрос задан
  • 115 просмотров
Решения вопроса 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();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
17 авг. 2018, в 17:10
15000 руб./за проект
17 авг. 2018, в 16:58
60000 руб./за проект
17 авг. 2018, в 16:55
10000 руб./за проект