2014-03-04 77 views
0

我正在嘗試編寫一個簡單的程序來刪除字符串中的元音和空格。下面的代碼有一些錯誤的行爲,我無法解釋。JavaScript .forEach()和.splice()不能按預期方式工作

var vowels, testString, splitString, disemvoweled; 

vowels = ['a', 'e', 'i', 'o', 'u']; 
testString = 'the quick brown fox jumped over the lazy dog'; 
splitString = testString.split(''); 

splitString.forEach(function (char) { 
    vowels.forEach(function (vowel) { 
     if (char === vowel || char === ' ') { 
     splitString.splice(splitString.indexOf(char), 1); 
     } 
    }); 
}); 

disemvoweled = splitString.toString(); 
console.log(disemvoweled); // 't,h,q,i,c,k,b,r,w,n,f,x,j,m,p,d,v,r,t,h,l,z,y,d' 

在上面返回的字符串,你將在第4位看到。此外,g對於未被包括在結果中。顯然,有些東西並沒有像預期的那樣工作。有人可以解釋爲什麼會這樣嗎?

+0

'焦炭=== vowel'應該是:'vowel.indexOf(焦炭)= -1 //在元音array' – andlrc

+0

我想指出你的這個運行時間是n^2。它可以及時完成:N。但它與手邊的問題無關。 – Fallenreaper

+0

@Fallenreaper你能詳細說明一下嗎?我不熟悉n^2與N. –

回答

3

我不知道你爲什麼不直接使用.replace()刪除元音和空間:

var testString = 'the quick brown fox jumped over the lazy dog'; 
var newString = testString.replace(/[aeiou\s]/ig, ""); 

如果你再想要一個逗號分隔字符串,你也可以這樣做:

newString = newString.split("").join(","); 

工作演示:http://jsfiddle.net/jfriend00/x3sXW/

+0

這是我建議的方法 – andlrc

+0

這是實現您的目標Evan的最佳方法,而且您不需要編寫它更有效率,正如我在上面關於你的代碼片斷的評論中所提到的那樣: – Fallenreaper

+0

@ jfreind00你可以這樣做:'newString.split(「」)。toString()'也是。默認情況下,'toString()'on一個數組會使得逗號分隔 – Fallenreaper

2

您的來電splice(index, 1)在索引中刪除的數組元素,通過一個整體平移以下索引。

由於這發生在forEach -loop內部,因此您可以使外循環跳過對該元音後面字符的檢查。

你可以使用filter()來避免變異你迭代數組:

splitString 
    .filter(function(character) { return vowels.indexOf(character) === -1; }) 
    .toString(); 
相關問題