javascript 这是JS的字符串操作问题,我不明白为什么主测试失败了

s4chpxco  于 2023-09-29  发布在  Java
关注(0)|答案(4)|浏览(84)

在主测试中失败的字符串操作练习。
我试着找出是否有字符丢失或损坏,但我不能弄清楚。

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;
  }

rqmkfv5c

rqmkfv5c1#

我不完全理解你在上面运行的测试,因为屏幕截图不是英文的,但是我可以从代码片段中看出你的相等性检查有一个逻辑错误。
lastIndexOf()返回一个数字(即字符串中字符的索引),如果在字符串中找不到,则返回-1-1是一个truthy值,因此如果找不到该值,它将不会返回false。除了0之外的所有内容都将在函数中返回false。
我相信你是想在字符串中找到字符时返回false,在这种情况下,你可以将等式改为:

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) > -1) {
            return false;
        }
    }
    return true;
}
mw3dktmi

mw3dktmi2#

如果短语中存在黑名单的任何字母,则应返回false。如果不是这样,那么将条件改为x.lastIndexOf(z)==-1

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)!=-1) {
                return false;
                }
        }
        return true;
      }
9q78igpj

9q78igpj3#

如果没有找到lastIndexOf,则返回值为-1。如果找到,它介于0和长度之间。
我把你的代码从if (x.lastIndexOf(z))改成了if (x.lastIndexOf(z) >= 0)
我不喜欢hasNoneLetters这个名字。在我看来,最好是测试字符串是否有任何禁止的字符,并在调用代码中进行否定:if (!hasLetters(phrase, blacklist))。这样,当确保相位至少有一个字符时,也可以使用该函数。

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) >= 0) {
      return false;
    }
  }
  return true;
}

run.onclick = () => result.textContent = hasNoneLetters(phrase.value, blacklist.value)
label {
  display: block;
}

label span {
  display: inline-block;
  width: 10ch;
}
<h1>hasNoneLetters</h1>
<p>Returns <b>false</b> if the phrase has any of the characters in blacklist</p>
<label><span>Phrase</span><input id="phrase" value="Mate Academy"></label>
<label><span>Blacklist</span><input id="blacklist" value="pqrs"></label>

<label><span>Result</span><output id="result"></label>
<button id="run">Run</button>

我创建了一个hasLetters,它将短语转换为数组,然后使用some-方法迭代列表值。

function hasLetters(phrase, list) {
  const x = phrase.toLowerCase();
  return Array.from( list.toLowerCase())
    .some( (d) => ~x.indexOf(d) )
}

run.onclick = () => result.textContent = hasLetters(phrase.value, list.value)
label {
  display: block;
}

label span {
  display: inline-block;
  width: 10ch;
}
<h1>hasLetters</h1>
<p>Returns <b>true</b> if the phrase has any of the characters in list</p>
<label><span>Phrase</span><input id="phrase" value="Mate Academy"></label>
<label><span>List</span><input id="list" value="pqrs"></label>

<label><span>Result</span><output id="result"></label>
<button id="run">Run</button>
jfgube3f

jfgube3f4#

下面是一个简短的脚本,基本上做同样的事情:

function hasNoneLetters(phrase, blacklist) {
  let x = phrase.toLowerCase(), res=false;
  blacklist.toLowerCase().split("").every(x=>res=!phrase.includes(x))
  return res;
}

// run a few tests:
const texts=["Hello everyone, I hope you are fine!","Good morning","Take care"],
      bl="false";
texts.forEach(t=>
  console.log(t,hasNoneLetters(t,bl))
)

到目前为止,它还没有处理变音、减号和减号(UTF字符集中的字母变体)。
使用.every()类似于在for循环中使用if (...) return

相关问题