2014-03-04 43 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(); 
相关问题