当前位置: 首页 > 知识库问答 >
问题:

通过多个函数运行一个值(Javascript)

魏澄邈
2023-03-14

我想创建一个函数“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()”取一个值,并在所有这些函数中运行它,最终给出该值是否为回文的答案(真或假)?

问候你,贝尼

共有3个答案

束建章
2023-03-14

您可以像这样将函数调用串在一起...

var input = 'Racecar';

if (checkPalindromes(reverseArray(keepOnlyLetters(makeSmall(input))))) {
   alert("It's a palindrome");
}
蒲坚
2023-03-14

因此,首先在尝试进行合成之前,有时最好按顺序进行,以确保您了解问题。随着你最终在构图上变得更好,你就会知道要使用什么工具。

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

好的,很好,我们从程序上理解它,并知道有四个步骤。然而,我们可以将这四个步骤分开,因为这两个步骤需要事先了解数组状态,我们不想引入<code>converge

function pipe (...fns){
  return fns.reduce( function (f, g){
    return function (...args){
      return g(
        f(...args)
      )
    }
  }
}

所有这些函数都将一堆函数预加载(组合)在一起,使一个函数的输出以从左到右顺序(也称为数组顺序)。

现在我们只需要三个函数来管道:

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

现在你已经开始学习函数合成了!

吴镜
2023-03-14

函数有一个收益递减的点。当调用函数与内联使用函数体一样短时,您可能已经达到了这一点。例如,makeSmall(input)实际上并没有改进仅仅使用input.toLowerCase()内联,并且会更慢,更难理解。input.toLowerCase() 已经是一个函数;只是浪费工作将其包装在另一个函数中。

话虽如此,为了回答您的问题,由于所有函数都返回下一个函数的输入值,因此可以将函数放入数组中并调用<code>reduce()</code>:

function palindromes(input) {
    return [makeSmall, keepOnlyLetters, reverseArray, checkPalindromes].reduce((a, c) => c(a), input)
}
 类似资料:
  • 问题内容: 我有一个脚本,它会根据几个因素生成一个SQL插入或更新脚本。以下是其生成的脚本的字符串值: 如果我在连接到数据库的sql编辑器中运行该脚本,它将运行得很好,并插入所有预期的行。但是,当这样调用该查询时: 返回此: 我将查询的生成方式从创建多个查询的串联字符串更改为创建查询数组并一次运行一个查询数组-这似乎已解决了该问题。 问题答案: 您不能通过单个php mysqli_query函数运

  • 目前,我正在尝试使用Eclipse中的PDFBox通过文本阅读器在一个文件夹中运行多个PDF文件,该阅读器将提取某些术语并将它们输出到一个文本文件中,然后我将转换为excel表单。目前我有一个程序,它可以正确地工作在一个PDF文件: public static void main(String args[])抛出IOException{ //...“提取文本的实际代码”... 我的问题是,我想在e

  • 问题内容: 我试图创建一个可以异步运行多个进程并发送响应的函数。由于不返回响应,因此我想创建一个函数为: 在此函数中,我异步调用,它接受的其他参数。由于列表是作为参考传递的,所以我认为我可以在列表中附加实际功能的响应。和将返回我所有的功能的响应。 但这并不符合我的预期。值会附加到中的,但工作人员列表外部仍为空。 知道我在做什么错吗?而且,有没有其他选择可以实现我的目标? 问题答案: 您不能直接在流

  • 问题内容: 选项:使用元组 考虑下面这个简单的例子: 但是,随着返回值的数量增加,这很快就会成为问题。如果要返回四个或五个值怎么办?当然,你可以继续修改它们,但是很容易忘记哪个值在哪里。在任何想要接收它们的地方打开它们的包装也是很丑陋的。 选项:使用字典 下一步的逻辑步骤似乎是引入某种“记录符号”。在Python中,一种明显的方法是使用dict。 考虑以下: (请注意,y0,y1和y2只是抽象标识

  • 问题内容: 表: 有了答案,我在这里得到了利用$ compile的这种方式 现在,当单击按钮时,我什至调用一个模态,并命令对象使用ng-model 感谢您的帮助,它运作良好。 问题答案: 编辑 :添加了用于演示 $ compile 用法的代码段 在html中,只有一个用于初始化应用程序的标签和一个用于初始化控制器的div。 在controller中,两个链接被创建为简单字符串,但分别具有两个,然后

  • 问题内容: 我正在做熊猫分析。 我的表有700万行* 30列。单元格值的范围从-1到3随机。现在,我想根据列的值过滤掉行。 我了解如何根据多个条件进行选择,写下条件并通过“&”“ |”组合。 但是我有30列要过滤,并按相同的值过滤。例如,需要选择最后12列的值等于-1 上面的代码给了我一个布尔值。我需要实际的数据框。 这里的逻辑是“或”,表示如果任何列的值为-1,则需要选择该行。另外,很高兴知道我