在主测试中失败的字符串操作练习。
我试着找出是否有字符丢失或损坏,但我不能弄清楚。
function hasNoneLetters(phrase, blacklist) {
let x = phrase.toLowerCase();
let y = blacklist.toLowerCase();
let z = '';
for (let i = 0; i <= blacklist.length-1; i++) {
z = blacklist[i];
if (x.lastIndexOf(z)) {
return false;
}
}
return true;
}
4条答案
按热度按时间rqmkfv5c1#
我不完全理解你在上面运行的测试,因为屏幕截图不是英文的,但是我可以从代码片段中看出你的相等性检查有一个逻辑错误。
lastIndexOf()
返回一个数字(即字符串中字符的索引),如果在字符串中找不到,则返回-1
。-1
是一个truthy值,因此如果找不到该值,它将不会返回false
。除了0
之外的所有内容都将在函数中返回false。我相信你是想在字符串中找到字符时返回
false
,在这种情况下,你可以将等式改为:mw3dktmi2#
如果短语中存在黑名单的任何字母,则应返回false。如果不是这样,那么将条件改为x.lastIndexOf(z)==-1
9q78igpj3#
如果没有找到lastIndexOf,则返回值为
-1
。如果找到,它介于0和长度之间。我把你的代码从
if (x.lastIndexOf(z))
改成了if (x.lastIndexOf(z) >= 0)
。我不喜欢
hasNoneLetters
这个名字。在我看来,最好是测试字符串是否有任何禁止的字符,并在调用代码中进行否定:if (!hasLetters(phrase, blacklist))
。这样,当确保相位至少有一个字符时,也可以使用该函数。我创建了一个
hasLetters
,它将短语转换为数组,然后使用some-方法迭代列表值。jfgube3f4#
下面是一个简短的脚本,基本上做同样的事情:
到目前为止,它还没有处理变音、减号和减号(UTF字符集中的字母变体)。
使用
.every()
类似于在for
循环中使用if (...) return
。