2017-02-20 42 views
0

我在使用我的.forEach循环时遇到了一些麻烦。这里是我当前的代码:ES6 .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; 
    } 
}; 

当我与debugger控制台运行它,它似乎跳过一些字母像bc。谁能告诉我这里发生了什么?

+0

这是一个有趣的高尔夫练习:'让isPangram =短语=>新Set(phrase.toLowerCase()。match(/ [az]/g))。size === 26;':D – loganfsmyth

+0

'return alphabet.every(letter => phrase.toLowerCase()。includes(letter)); 'https://jsfiddle.net/a5w5db66/ – pawel

回答

1

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

更安全的方法是使用传统的for循环,并从头到尾进行迭代。然后,您对该数组所做的任何更改都将超出您正在迭代的范围。当然,可能只是一个更好的总体方法来写这个没有拼接。就个人而言,我可能会使用一个Set对象来跟踪所有使用的字母,并看看最终是否最终都会有26个。

MDN page for .forEach()“如果被除去那些已经访问过的元件(例如,使用移位())的迭代期间,后面的元素将被跳过 - 见下面的例子。”

另外,forEach()对于ES6来说并不新鲜,它自ES5以来就一直存在。


下面是使用一些ES6功能来测试全字母短句非删除方式:

const allCharsSet = new Set("abcdefghijklmnopqrstuvwxyz"); 
 

 
function isPangram(phrase) { 
 
    let foundLetters = new Set(); 
 
    for (let ch of phrase) { 
 
    \t ch = ch.toLowerCase(); 
 
     if (allCharsSet.has(ch)) { 
 
     \t 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"));

+0

谢谢!这很有意义。我最终创建了一个名为'matches'的新数组,每当我得到一个匹配时,我将这个字母推入新数组中,并且工作。再次感谢! –

+0

@GeorgeLi - 自从你提到ES6以来,我已经添加了一个ES6的方式,不需要从数组中删除东西。 – jfriend00

+0

@GeorgeLi - 因为您看起来可能是新手,如果这已经回答了您的问题,那么您可以通过点击答案左侧的绿色复选标记来向社区表明。这也可以为您赢得一些可以在网站上获得更多特权的声望点。 – jfriend00