gpt4 book ai didi

javascript - ES6 .forEach方法不循环数组?

转载 作者:行者123 更新时间:2023-12-03 04:57:58 24 4
gpt4 key购买 nike

我的 .forEach 循环遇到一些问题。这是我当前的代码:

let isPangram = (phrase) => {
let alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
alphabet.forEach(function(letter) {
if (phrase.toLowerCase().includes(letter)) {
alphabet.splice(alphabet.indexOf(letter), 1);
}
debugger;
});
if (alphabet.length === 0) {
return true;
}
else if (alphabet.length > 0) {
return false;
}
};

当我使用调试器在控制台中运行它时,它似乎跳过了一些字母,例如bc。谁能告诉我这是怎么回事?

最佳答案

使用 .forEach() 进行迭代时,不应从数组中删除当前元素。 。当您使用 .splice() 删除时,它会删除一个元素,然后数组中的元素向下移动一个槽,然后迭代的下一步会错过刚刚移入当前迭代槽的元素。

更安全的方法是使用传统的 for循环并从尾到前向后迭代。然后,您对数组所做的任何更改都将超出您正在迭代的范围。当然,可能有一种更好的整体方法来编写这个而不需要拼接。就我个人而言,我可能会使用 Set对象跟踪所有使用过的字母,看看我最终是否得到了所有 26 个字母。

来自MDN page for .forEach() :“如果在迭代过程中删除了已经访问过的元素(例如使用 shift()),则后面的元素将被跳过 - 请参阅下面的示例。”

此外,forEach()对于 ES6 来说并不是什么新鲜事,它从 ES5 就已经存在了。

<小时/>

这是一种使用一些 ES6 功能来测试全语法的非删除方法:

const allCharsSet = new Set("abcdefghijklmnopqrstuvwxyz");

function isPangram(phrase) {
let foundLetters = new Set();
for (let ch of phrase) {
ch = ch.toLowerCase();
if (allCharsSet.has(ch)) {
foundLetters.add(ch);
}
}
return foundLetters.size === allCharsSet.size;
}

console.log(isPangram("The five boxing wizards jump quickly."));
console.log(isPangram("Many-wived Jack laughs at probes of sex quiz."));
console.log(isPangram("Playing jazz vibe chords quickly excites my wife."));
console.log(isPangram("some other phrase"));

关于javascript - ES6 .forEach方法不循环数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com