Выполнить одно значение через несколько функций (Javascript) - PullRequest
0 голосов
/ 29 июня 2018

Я хочу создать функцию "palindromes ()", которая проверяет, является ли значение палиндромом (пишется одинаково вперед и назад). Для этого я создал 4 функции, которые:

  1. Делает все буквы маленькими
  2. Удаляет все не-буквенные символы
  3. Переворачивает следующий массив и, наконец, ...
  4. Проверяет, является ли этот массив палиндромом.

См. Функции ниже:

  function makeSmall(input) {
    lowerCase = input.toLowerCase();
    return lowerCase;
  }

  function keepOnlyLetters(input) {
    var patt1 = /[a-z]/g;
    var onlyLetters = input.match(patt1);
    return onlyLetters;
  }

  function reverseArray(array) {
    var reversedArray = array.slice().reverse();
    return reversedArray;
  }

  function checkPalindromes(array) {
    var reversedArray = array.slice().reverse();
    for (let i = 0; i <= array.length; i++) {
      if (array[i] != reversedArray[i]) {
        return false;
      }
    }
    return true;
  }

Как мне убедиться, что функция "palindromes ()" принимает одно значение и пропускает его через все эти функции, чтобы, наконец, дать мне ответ (истина или ложь) о том, является ли это значение палиндромом или нет?

С наилучшими пожеланиями, Бени

Ответы [ 5 ]

0 голосов
/ 29 июня 2018

Есть точка уменьшения отдачи с функциями. Когда вызов функции такой же короткий, как и использование встроенного тела функции, вы, вероятно, достигли этой точки. Например, makeSmall(input) на самом деле не является улучшением по сравнению с использованием input.toLowerCase() inline и будет медленнее и сложнее для понимания. input.toLowerCase() уже является функцией; это просто потраченная впустую работа, чтобы обернуть ее в другую функцию.

Сказав это, чтобы ответить на ваш вопрос, поскольку все ваши функции возвращают значение, которое вводится для следующего, вы можете поместить свои функции в массив и вызывать reduce():

function palindromes(input) {
    return [makeSmall, keepOnlyLetters, reverseArray, checkPalindromes].reduce((a, c) => c(a), input)
}
0 голосов
/ 29 июня 2018

Вы можете просто вызывать их во вложенном виде и возвращать конечный результат в вашей функции палиндрома.

Пример кода: (с изменениями, указанными в комментариях)

function makeSmall(input) {
    // Added var to prevent it from being a global
    var lowerCase = input.toLowerCase();
    return lowerCase;
}

function keepOnlyLetters(input) {
    var patt1 = /[a-z]/g;
    var onlyLetters = input.match(patt1);
    return onlyLetters;
}

// This function is not really needed and is unused
/*function reverseArray(array) {
    var reversedArray = array.slice().reverse();
    return reversedArray;
}*/

function checkPalindromes(array) {
    var reversedArray = array.slice().reverse();
    for (let i = 0; i <= array.length; i++) {
        if (array[i] != reversedArray[i]) {
            return false;
        }
    }
    return true;
}

// New Palindromes function
function palindromes(input){
    return checkPalindromes(keepOnlyLetters(makeSmall(input)));
}

Примечание:

Вам не нужно так много функций, чтобы сделать это. Я ставлю это здесь как строгий ответ на ваш точный вопрос. Другие ответы здесь показывают, как вы можете решить эту проблему более короткими (и лучше?) Способами

0 голосов
/ 29 июня 2018

Вы можете просто связать вызовы функций вместе, как это ...

var input = 'Racecar';

if (checkPalindromes(reverseArray(keepOnlyLetters(makeSmall(input))))) {
   alert("It's a palindrome");
}
0 голосов
/ 29 июня 2018

Итак, сначала, прежде чем пытаться создать композицию, сначала лучше всего последовательно сделать это, чтобы убедиться, что вы понимаете проблему. Когда вы станете лучше разбираться в композиции, вы будете знать, какие инструменты использовать.

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

Теперь вы на пути к изучению композиции функций!

0 голосов
/ 29 июня 2018

попробуйте следующий фрагмент.

    function makeSmall(input) {
        lowerCase = input.toLowerCase();
        return lowerCase;
    }

    function keepOnlyLetters(input) {
        var patt1 = /[a-z]/g;
        var onlyLetters = input.match(patt1);
        return onlyLetters;
    }

    function reverseArray(array) {
        var reversedArray = array.slice().reverse();
        return reversedArray;
    }

    function checkPalindromes(array) {
        var reversedArray = array.slice().reverse();
        for (let i = 0; i <= array.length; i++) {
          if (array[i] != reversedArray[i]) {
            return false;
          }
        }
        return true;
    }
    
    var result = checkPalindromes(reverseArray(keepOnlyLetters(makeSmall("Eva, Can I Stab Bats In A Cave"))));
    
    console.log(result);

Обратите внимание, как функции вызываются одна за другой в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...