Итак, сначала, прежде чем пытаться создать композицию, сначала лучше всего последовательно сделать это, чтобы убедиться, что вы понимаете проблему. Когда вы станете лучше разбираться в композиции, вы будете знать, какие инструменты использовать.
function checkPalindrome(string){
return string
.toLowerCase()
.match(/[a-z]/g)
.reverse()
.reduce(function ( acc, letter, index ) {
return acc && string[index] == letter
})
}
checkPalindrome('test') // false
checkPalindrome('tet') // true
Хорошо, хорошо, мы понимаем это процедурно и знаем, что есть четыре шага. Мы могли бы разделить эти четыре шага, однако, так как два шага требуют предварительного знания состояния массива, и мы не хотим вводить converge
или lift
, просто мы должны вместо этого просто использовать pipe function
и объедините шаги, которые требуют предыдущего состояния. Причиной этого является то, что функции в конечном итоге просто теряют, насколько меньше их можно сделать, и попытка разделить эти шаги не только ухудшает читабельность, но и удобство обслуживания. Это не очень хорошая отдача от усилий, приложенных для выполнения двух функций для этой части!
function pipe (...fns){
return fns.reduce( function (f, g){
return function (...args){
return g(
f(...args)
)
}
}
}
Вся эта функция делает это, она предварительно загружает (компонует) кучу функций вместе, чтобы сделать так, чтобы выходные данные одной функции применялись к входу следующей функции в порядке left to right
(также известном как порядок массива). ).
Теперь нам просто нужно три функции для конвейера:
function bringDown(string){ return string.toLowerCase() } // ussually called toLower, see note
function onlyLetters(string){ return string.match(/[a-z]/g) }
function flipItAndReverseItCompare(arrayLike){ // I like missy elliot... ok?
let original = Array.from(arrayLike)
return original
.slice()
.reverse()
.reduce(function (acc, val, ind){
return acc && val == original[ind]
})
}
Теперь мы можем просто трубить их
let palindrome = pipe(
bringDown,
onlyLetters,
flipItAndReverseItCompare
)
!palindrome('Missy Elliot') // true... and I never will be
palindrome('Te t') // true
Теперь вы на пути к изучению композиции функций!