JavaScript .forEach()和.splice()无法按预期工作

时间:2014-03-04 21:06:16

标签: javascript

我正在尝试编写一个简单的程序来从字符串中删除元音和空格。以下代码存在一些我无法解释的错误行为。

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 未包含在结果中。显然,某些东西没有按预期工作。有人可以解释为什么会这样吗?

2 个答案:

答案 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(",");

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

答案 1 :(得分:2)

您对splice(index, 1)的调用会删除索引处的数组元素,将所有后续索引移动一个。

由于这是在forEach - 循环内发生的,所以你让外循环跳过对该元音后面的字符的检查。

您可以使用filter()来避免改变正在迭代的数组:

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