我正在尝试编写一个简单的程序来从字符串中删除元音和空格。以下代码存在一些我无法解释的错误行为。
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个位置看到 i 。此外, dog 的 g 未包含在结果中。显然,某些东西没有按预期工作。有人可以解释为什么会这样吗?
答案 0 :(得分:3)
我不确定为什么你不只是使用.replace()
删除元音和空格:
var testString = 'the quick brown fox jumped over the lazy dog';
var newString = testString.replace(/[aeiou\s]/ig, "");
如果你想要一个以逗号分隔的字符串,你也可以这样做:
newString = newString.split("").join(",");
答案 1 :(得分:2)
您对splice(index, 1)
的调用会删除索引处的数组元素,将所有后续索引移动一个。
由于这是在forEach
- 循环内发生的,所以你让外循环跳过对该元音后面的字符的检查。
您可以使用filter()
来避免改变正在迭代的数组:
splitString
.filter(function(character) { return vowels.indexOf(character) === -1; })
.toString();