2015-10-07 87 views
-3

我有一個可以包含都不可能包含空白列表的非常簡單的字符串:.trim()不是一個函數

string = "one, two,three "; 

我想先拆由,字符串創建三個數組串,然後使用.trim()

array = string.split(',').trim(); 

返回"one","two","three"

但是有時它失敗並返回一個錯誤消除任何空白.trim() is not a function

我讀了.trim()返回一個新的字符串,而不是當前字符串的修剪版本。所以我用一個for循環做以上:

array = string.split(','); 
for (var i = 0; i < array.length; i++) { 
    var item = array[i].trim(); 
    array.push(item); 
} 

返回"one","two","three"

我的問題是,任何人都可以解釋爲什麼我收到錯誤只是偶爾?如果陣列從我的示例中永遠不會改變,並且任何人都可以爲我的修復提供更清晰的解

+7

你應該每次都得到'TypeError:array.split不是一個函數',所以它永遠不會得到你所說的錯誤 –

+0

''這會返回「one」,「two」,「three」 - 不,它不會...它也抱怨array.split不是一個函數 - 我建議如果你需要代碼的幫助,當你簡化它,確保它顯示相同的錯誤真正的代碼有 –

+0

split()方法通過將字符串分隔成子字符串,將字符串對象分割成字符串數組,從[doc](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split) –

回答

2

split()不適用於數組,但在字符串上。 當您將字符串寫入數組時,您必須通過array[0]獲取該字符串,因爲字符串是第一個元素。

如果將字符串拆分爲數組,則可以調用map函數並修剪新創建的數組中的每個值。 這樣的:

array = ["one, two,three "]; 
array = array[0].split(',') 
array = array.map(function(a){return a.trim()}) 

或簡稱:

array = ["one, two,three "][0].split(',').map(function(a){return a.trim()}) 
1

在ES6兼容的運行(即:節點4+),可以使用使用箭頭功能,讓你不那麼冗長的代碼來實現你的目標:

> "one, two, three ".split(',').map(s => s.trim()); 
[ 'one', 'two', 'three' ] 
0

我看到這個試圖重複String.split的使用輸出「爲(VAR我在splitTokens)」同樣的問題。請注意,它只發生在瀏覽器中(我的情況是Chrome),即不在節點進程中使用相同的代碼。

它讓我困惑,直到我連接了一個調試器,然後我看到了問題。 String.split返回一個Array對象實例(splitTokens),它具有函數(「each」等)。 「for(var i in splitTokens)」循環也迭代函數,因此splitTokens [i] Array實例的每個函數,如果我嘗試呼叫例如這個函數就會導致爆炸。 「trim()」(因爲函數對象沒有一個名爲trim()的函數)。