【问题标题】:JavaScript: Join() and Match() not working as expectedJavaScript:Join() 和 Match() 未按预期工作
【发布时间】:2018-06-17 18:47:57
【问题描述】:

我正在尝试反转字符串,并过滤掉非字母字符。但由于某种原因,该函数返回一个数组而不是一个字符串。

var palindromes = function(str) {
    str = str.toLowerCase().split("").reverse("").join("");
    return str.match(/[a-z]/g);
}

如果我通过 "foof!" 我期望 "foof",但我得到的是 ["f", "o", "o", "f"] 真正奇怪的是 return str 返回字符串,但标点符号当然保留了。所以看起来 ma​​tch() 造成了问题。

【问题讨论】:

  • 为什么match 在那里检查回文?不应该只是return str.toLowerCase().split("").reverse("").join("") == str 吗?
  • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 表示match 的返回值是一个数组...
  • @putvande oooohhhh...所以如果它是一个数组,我可以用什么方法代替?
  • str.replace(/[^a-z]/g, ''); 过滤非字母字符
  • 我还注意到 return str.match(/[a-z]/g).join(""); 给了我预期的结果......至少到目前为止。

标签: javascript arrays regex string


【解决方案1】:

您的意图:过滤掉非字母字符。
您应该为此使用str.replace(/[^a-z]/g, '');[^a-z] 是一个否定字符组,它将选择除 a-z 之外的所有字符,replace 将允许您将值替换为 ''

您的函数名称是palindrome,检查没有意义。回文可以很容易地检查:

return str.toLowerCase().split('').reverse().join('') === str.toLowerCase()

您在原始代码中使用match,根据传递的标志,它具有不同的行为。如果传递了 global(g) 标志,它将在数组中给出所有匹配结果。如果不使用g,它将在数组中给出第0位匹配值的结果。

str = 'foof'
console.log(str.match(/[a-z]+/))
console.log(str.match(/[a-z]/g))

【讨论】:

  • .reverse()不带参数,不应该是=== str.toLowerCase()吗?我个人希望 Foof 能够通过回文测试,但我不确定作者对此类情况的意图是什么。
  • @PatrickRoberts 你是对的。我没有仔细检查表达式;编辑为str.toLowerCase().reverse() === str.toLowerCase()
  • 字符串没有.reverse() 方法,.split("").join("") 是必需的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多