2013-12-18 12 views
8

array.spliceを使用すると、配列をインプレースで変更するので、エラーをスローせずに配列からすべての空白のみの要素を削除するにはどうすればよいですか?私たちはpreg_grepを持っていますが、私はどのようにしてJSでこれを正しく行いますか?空白のみの配列要素を削除する

以下があるため、上記の理由で動作しません。

for (var i=0, l=src.length; i<l; i++) { 

    if (src[i].match(/^[\s\t]{2,}$/) !== null) src.splice(i, 1); 

} 

エラー:

Uncaught TypeError: Cannot call method 'match' of undefined

+0

実際に配列を変更したいのですか、または2番目のフィルタリングされた配列を生成しても構いませんか? – canon

答えて

17

より良い方法を「アレイから空白のみの要素を削除」します。

var array = ['1', ' ', 'c']; 

array = array.filter(function(str) { 
    return /\S/.test(str); 
}); 

説明:

Array.prototype.filter機能のみがtrueを返すための要素(又はtruthy値)を含む、新しい配列を返します。

/\S/は、空白以外の文字と一致する正規表現です。 /\S/.test(str)は、strに空白以外の文字が含まれているかどうかを返します。

+0

彼はテストセクションではなく 'for'ループの初期化セクションに' l = src.length'を持っています。 – Barmar

+0

@Barmar、正しい。 –

+0

[Array.splice()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)_配列がインプレースで変更されていませんか?説明してください。 – canon

2

アレイの長さを短縮したアイテムをアレイから削除しました。あなたのループは継続され、いくつかのインデックス(削除されたインデックスにダウンシフトされたもの)をスキップし、最終的に新しい範囲外のインデックスにアクセスしようとしました。

代わりにこれを試してみてください:

var src = ["1"," ","2","3"]; 
 
var i = src.length;  
 
while(i--) !/\S/.test(src[i]) && src.splice(i, 1); 
 
console.log(src);

0

と新世代(すなわちES2015)のために:

['1', ' ', 'c'].filter(item => item.trim() !== '') 

More on trim()

3

別のフィルタベースのバリエーション - 再利用可能(機能)

function removeWhiteSpaceFromArray(array){ 
    return array.filter((item) => item != ' '); 
} 
0

= "ホワイトスペースを削除"

a.split(' ').join('').split(''); 

はない '空白' 文字と{A = "ホワイトスペースを削除"}内のすべての文字の配列を返します。

split()メソッドとjoin()メソッドを別々にテストすることができます。

関連する問題