从数组中删除空字符串(正则表达式) - Javascript

时间:2013-02-05 21:11:20

标签: javascript arrays parsing

我的项目中有以下代码:

for(i = 0; i < inputArr.length; i++) {
    if(accountsBool) {
        inputArr[i] = inputArr[i].split(/\s+/);
        if (inputArr[i] == "" || !inputArr[i].match(/[^\s]/)) {
            inputArr.splice(i,1);
        }
    }
}

我会尽力解释这个问题......

我需要这部分代码删除所有空格和空字符串,但是行......

inputArr[i] = inputArr[i].split(/\s+/);

和...

if (inputArr[i] == "" || !inputArr[i].match(/[^\s]/)) {
    inputArr.splice(i,1);
}

......不要一起工作。我收到错误,“对象不支持此属性或方法”。如果我注释掉一个并用另一个运行代码它似乎工作正常。语法似乎也是正确的。有什么想法吗?

inputArr是一个从文本区域解析的字符串数组。

谢谢。

5 个答案:

答案 0 :(得分:3)

.split()返回一个数组,该数组不适用于.match()

  

我需要这部分代码删除所有空格和空字符串,但行......

您似乎在说,应该从数组中删除不包含至少一个非空白字符的项目,并且应该更新任何剩余项目以删除任何空格(但保留其他字符) 。如果是,请先使用.replace()删除空格,然后测试是否删除该项目。

请注意,如果在循环中使用.splice(),则需要调整迭代器变量i以允许缺少元素 - 或者更简单,向后循环。 < / p>

for(i = inputArr.length - 1; i >= 0; i--) {
    if(accountsBool) {
        inputArr[i] = inputArr[i].replace(/\s/g,"");
        if (inputArr[i] === "") {
            inputArr.splice(i,1);
        }
    }
}

如果您说要删除不包含至少一个非空白字符的项目,但是您想在其余元素中留下空格,请执行以下操作:

for(i = inputArr.length - 1; i >= 0; i--) {
    if(accountsBool) {
        if (!/[^\s]/.test(inputArr[i])) {
            inputArr.splice(i,1);
        }
    }
}

另请注意,如果循环中没有其他处理,则应将if(accountsBool)测试移至循环之前,而不是在每次迭代时执行。

答案 1 :(得分:0)

String.split()将字符串拆分为一个数组,稍后您将其视为字符串。 您可以使用replace函数代替split:

inputArr[i] = inputArr[i].replace(/\s+/g, '');

然后:

if (inputArr[i] == "") {
    inputArr.splice(i,1);
}

答案 2 :(得分:0)

如果您更换

inputArr[i] = inputArr[i].split(/\s+/);

inputArr[i] = inputArr[i].replace(/\s/g,'');

应解决一个问题。

此外,!inputArr[i].match(/[^\s]/)是多余的,因为您已从该输入数组值中删除了所有空格。

最后,您需要在拼接数组时递减索引,或者以相反的顺序迭代。

Here's a working fiddle进行测试。

答案 3 :(得分:0)

您需要在您描述的循环中使用另一个循环,该循环将通过split方法生成的数组。正如评论者所说,使用数组不可能match。如下所示:

for (var i = 0; i < inputArr.length; i++) {
    if(accountsBool) {
        inputArr[i] = inputArr[i].split(/\s+/); // produces an array
        for (var j = 0; j < inputArr[i].length; j++) {
            if (inputArr[i][j] === "" || !inputArr[i][j].match(/[\S]/)) { // check each string in the array for empty or space
                // inputArr.splice(i,1);
            }
        }
    }
}

如上所述,RegEx的[^\s]部分也可以重写[\S]

但是你用splice试图做什么并不完全清楚(因此我在上面评论过)。如果你试图完全摆脱字符串中的所有空格,那么你的代码可以简单得多 - 你只需要使用replace方法。

如果您正在尝试摆脱过多的空白,那么您的代码可能会更简单:只需在每个字符串上使用replace并使用/\s+/作为您的RegEx搜索模式和' '作为替代。之后可以通过简单的条件检查删除空字符串...

for (var i = 0; i < inputArr.length; i += 1) {
    if (accountsBool) {
        inputArr[i] = inputArr[i].replace(/\s+/, ' '); // replaces all multiple spaces with one space
        if (!inputArr[i]) { // check each string in the array for empty or space
                inputArr.splice(i,1);
        }
    }
}

这将为您留下字符串,例如,单词之间有空格,但永远不会超过一个空格(例如,它应该摆脱双倍间距和制表符间距)。

答案 4 :(得分:0)

如果要删除空字符串或仅空格的条目,请在数组上使用.filter()

inputArr = inputArr.filter(function(item) {
    return accountsBool && Boolean(item.trim())
});

请注意以下事项:

  • 这将用新的数组替换旧数组
  • 对于旧浏览器,您需要垫片.filter()
  • 旧浏览器需要.trim()的垫片
    • 您可以使用item.replace(/^\s+|\s+$/g, "")代替item.trim()