javascript - 回文检查器 - for 循环的问题

标签 javascript

我正在学习javaScript并编写一个回文检查器来练习。它不起作用,通过使用 print 语句,我将问题范围缩小到了 for 循环的问题。我不明白为什么它不起作用;有人能阐明一下吗?

function palindrome(str) {
  var newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();
  console.log(newString)
  var forwardsArray = newString.split("");
  console.log(forwardsArray)
  var backwardsArray = forwardsArray.reverse();
  console.log(backwardsArray)
  for (var i = 0; i < backwardsArray.length; i++) {
    for (var j = 0; j < forwardsArray.length; j++) {
      console.log(backwardsArray[i])
      console.log(forwardsArray[i])
      if (forwardsArray[j] !== backwardsArray[i]) {
        return false;
      }
    }
    return true;
  }
}

最佳答案

我同意其他评论者的观点,即有 better ways to find palindromes ,但我认为这是一个很好的学习机会,因为您的代码中有一个常见的初学者陷阱,您可能会从了解它中受益。

最大的问题当然是你的for循环检查backwardsArray的每个项目是否等于forwardsArray的每个项目,除非你的单词只包含所有相似的字符,否则这不会是真的。

实际上,您只想检查前向数组中的字符是否与后向数组中同一索引处的字符相同,因此您只需要一个 for 循环。

但一个不太明显的问题是 Array.reverse “就地”反转数组。这意味着当您调用reverse而不是返回新副本时,forwardsArray会被修改,因此backwardsArray和forwardsArray引用完全相同的数组。

您应该在此处克隆数组。一种流行的方法就是使用 Array.slice

function palindrome(str) {

  var newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();

  var forwardsArray = newString.split("");
  // Copy the array
  var backwardsArray = forwardsArray.slice().reverse();
  
  for (var i = 0; i < backwardsArray.length; i++) {
      var backwardChar = backwardsArray[i]
      var forewardChar = forwardsArray[i]
      if(backwardChar !== forewardChar){
        return false
      }
  }
  return true;
}

console.log(palindrome("racecar")) // true

console.log(palindrome("ralecar")) // false

关于javascript - 回文检查器 - for 循环的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873563/

相关文章:

javascript - 验证防伪 key 不适用于ajax post

javascript - 当我不知道 jQuery 的更改时刻时,触发隐藏字段上的更改事件?

javascript - div 中的文本溢出未按预期工作!

javascript - 将多个表单数据传递给 jquery 函数

javascript - 新标签页中的 HTML

javascript - 如何使用 jQuery 或 javascript 自动创建结合两个字段的用户名?

javascript - 如果登录成功,有条件地关闭 Bootstrap 模式面板

javascript - JavaScript 中非 IE 浏览器兼容性所需的帮助

javascript - 如何在 Node.js 和浏览器之间共享代码?

Javascript : go back with new parameters