为什么我的脚本说'('===')'是真的?

我在 codewars 上做这个 kata。如果传入的第一个参数(字符串)以第二个参数(也是一个字符串)结尾,则该问题希望函数返回 true。所以我写了我的功能,一切工作就好了,直到它比较':-)'':-('和返回true。

怎么了?我非常自信我的代码应该可以工作,我什至不知道要搜索什么。

function solution(str, ending){
  if (!ending) return true; // if ending is a empty string return true (the question wants that)
  let ok;
  const strArr = str.split(''), endingArr = ending.split('');
  for (let i = 0; i < endingArr.length; i++) strArr.reverse()[i] === endingArr.reverse()[i] ? ok = true : ok = false;
  return ok;
}

console.log(solution(":-)",":-("));

回答

你的问题是对什么的误解reverse()。它不返回旧数组的反转副本,而是反转现有数组并返回相同的数组。结果,您在循环的每次迭代中不断来回反转数组,导致某些元素被跳过,某些元素被检查两次。

MDN 上的 Array.prototype.reverse()

编辑:

正如其他人在评论中指出的那样,对于问题和这个答案,实际上存在多个问题。

reverse()除此之外,循环始终设置ok为上次比较的结果,从而使函数忽略所有先前的结果。

实现这一点的更简单方法是ok完全删除。相反,false一旦检测到不匹配就返回。如果函数运行的时间足够长以退出循环,则意味着没有检测到不匹配并且true可以返回。

编辑2:

就像一个友好的建议:

虽然两者reverse()ok与代码真正的问题,我只注意到的第一个第一次就由于代码的格式。ok由于线路太长,问题出在屏幕外。因此,一旦我发现了这个reverse()问题,我就认为就是这样,并没有费心横向滚动来查看其余的代码。

我不会要求您以某种方式编写自己的代码,但是如果您正确格式化它,它会让其他人更容易阅读。从本质上讲,您帮助我们更轻松地帮助您。

例如,这一行:

for (let i = 0; i < endingArr.length; i++) strArr.reverse()[i] === endingArr.reverse()[i] ? ok = true : ok = false;

……阅读起来会容易得多……

for (let i = 0; i < endingArr.length; i++) {
  if(strArr.reverse()[i] === endingArr.reverse()[i])
    ok = true;
  else
    ok = false;
}

...或其一些变体。在这里,问题明显更加明显。

  • OP 也在每次迭代中重新分配 `ok`,只返回最后一个值。

以上是为什么我的脚本说'('===')'是真的?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>