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()

すべての空白と空の文字列を削除するには、コードのこの部分が必要ですが、行は...

少なくとも1つの非空白文字を含まないアイテムは配列から削除する必要があり、残りのアイテムは空白を削除するように更新する必要があると言っているようです(ただし、他の文字は保持します)。その場合は、.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);
        }
    }
}

少なくとも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

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,'');

これで1つの問題が修正されるはずです。

また、!inputArr[i].match(/[^\s]/)その入力配列値からすべての空白をすでに削除しているため、冗長です。

最後に、配列をスプライスするときにインデックスをデクリメントするか、逆の順序で繰り返す必要があります。

これがテストするための実用的なフィドルです。

于 2013-02-05T21:19:51.203 に答える
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);
            }
        }
    }
}

また、上記のように、正規表現の[^\s]一部を書き換えることもできます[\S]

しかし、あなたが何をしようとしているのかは完全には明らかではありませんsplice(したがって、私はそれを上でコメントしました)。文字列内のすべてのスペースを完全に削除しようとしている場合は、コードがはるかに単純になる可能性がありますreplace。メソッドを使用するだけです。

過剰な空白を削除しようとしている場合も、コードははるかに単純になる可能性があります。replace各文字列で、/\s+/正規表現の検索パターンおよび' '置換として使用するだけです。空の文字列は、すでに持っている簡単な条件付きチェックで後で削除できます...

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

.filter()空の文字列または空白のみのエントリを削除する場合は、配列でを使用します。

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

次の点に注意してください。

  • これにより、古いアレイが新しいアレイに置き換えられます
  • .filter()古いブラウザにはシムが必要です
  • .trim()古いブラウザ にはシムが必要です
    • item.replace(/^\s+|\s+$/g, "")代わりに使用できますitem.trim()
于 2013-02-05T21:42:40.620 に答える