Как вызвать console.log в arrow functions

Когда увлекаешься ФП стилем и стрелочными функциями, наступает момент, когда код обилует функциями вида

const y = x => f(x);

Если вдруг вам надо отдебажить код и залогировать такую функцию, то часто это делается так:

const y = x => {
console.log(x)
return f(x)
}

Мастера ES напишут этот код так:

const y = x => (console.log(x), f(x));

Но недавно мне подсказал более клевое решение мой товарищ и коллега:

const y = x => console.log(x) || f(x);

Всегда будет выполнена левая часть, при этом console.log возвращает undefined, что приводит к выполнению правой части и возврату значения из правой части.

Логируем map

Если же вам нужно залогировать обраотку цепочки map-reduce последовательности, то для этого можно использовать следующие варианты:

a.map(x => f(x))
.map(console.log) // далее undefined
.map(...)
.reduce(...)
;

Минусы такого подхода — это то, что у нас дальше логирования результата не будет. Но таким подходом можно делать быстрый просмотр промежуточных результатов. Затем комментируем логирование и смотрим работу всей цепочки.

a.map(x => f(x))
//.map(console.log)
.map(...)
//.map(console.log)
.reduce(...)
;

Не так удобно. Поэтому применяем уже описанный выше лайфхак:

a.map(x => console.log(x = f(x)) ||  x)
.map(...)
.filter(...)
.reduce(...)
;

UPD

Grigorii Horos в комментариях показал еще одно интересное решение:

a.filter(x => !console.log(x))
.map(...)

filter всегда возвращает boolean значение. Если True — элемент остается. Так как console.log() всегда возвращает `void 0` , то используя это, мы можем через инверсию всегда возвращать True. При этом мы дампим поток map-reduce логики. Удобно.