2013-12-18 29 views
8

由於使用array.splice就地修改了數組,我怎樣才能從數組中刪除所有隻有空白的元素而不會引發錯誤?用PHP我們有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

你真的想改變陣列嗎?或者你還好嗎?生成第二個過濾的數組? – 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)_doesn't_就地修改數組嗎?請解釋。 – 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()。