0

我的项目中有以下代码:

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 是从文本区域解析的字符串数组。

谢谢你。

4

5 回答 5

3

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

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

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

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

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)测试移到循环之前,而不是在每次迭代时都进行。

于 2013-02-05T21:22:32.373 回答
0

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

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

请注意以下事项:

  • 这用新数组替换旧数组
  • .filter()对于旧浏览器,您需要一个 shim
  • .trim()对于旧浏览器 ,您需要一个 shim
    • 你可以使用item.replace(/^\s+|\s+$/g, "")而不是item.trim()
于 2013-02-05T21:42:40.620 回答
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);
        }
    }
}

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

于 2013-02-05T21:29:20.793 回答
0

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

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

然后:

if (inputArr[i] == "") {
    inputArr.splice(i,1);
}
于 2013-02-05T21:19:16.663 回答
0

如果你更换

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

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

这应该可以解决一个问题。

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

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

这是一个要测试的工作小提琴。

于 2013-02-05T21:19:51.203 回答