簡體   English   中英

如何安全地將逗號分隔的字符串轉換為數字數組

[英]How to safely convert a comma-separated string to an array of numbers

編輯

為什么這不重復

這個問題專門解決了使用Number(str)將空字符串以及任意數量的空格字符轉換為0

看一下以下片段:

 convertBtn.addEventListener('click', () => console.log(toArrayOfNumber(foo.value))) const toArrayOfNumber = str => str.split(',').map(Number); 
 <input type="text" id="foo" value="1,2,4,-1" /> <button type="button" id="convertBtn">convert to array of numbers</button> 

只要輸入具有適當的value一切正常。 現在我想讓它對以下值保持安全:

  • ,
  • , ,,

讓我措手不及的是, Number("")Number(" ")都返回0 (我不想要我的用例我不想要""或任意數量的空格被視為Number )。

所以我想出了這個:

 convertBtn.addEventListener('click', () => console.log(toArrayOfNumber(foo.value))) const toArrayOfNumber = str => str.split(',').filter(x => x.trim() !== "").map(Number); 
 <input type="text" id="foo" value="1,2,4,-1,,, ,, 11" /> <button type="button" id="convertBtn">convert to array of numbers</button> 

這感覺很尷尬,我希望有一個明顯的,更好的解決方案,我沒有看到。

來自@KendallFrey的回答(誰拒絕發帖,所以我偷了他的解決方案)

'1,2,4,-1,,, ,, 11,0,0'.split(/[, ]+/).map(x=>+x)

您仍然可以使用.map(Number)x=>+x縮短1個字節。

控制台中的結果: (7) [1, 2, 4, -1, 11, 0, 0]

另一個正則表達式解決方案(不允許小數): /-?\\d+/g

如果您只處理整數,則以下內容也適用。 將保留0,但將刪除空值。

split(',').filter(num => !isNaN(parseInt(num))).map(Number);

 const str = '1,2,4,-1,,, ,0, 11'; console.log(str.split(',').filter(num => !isNaN(parseInt(num))).map(Number)); 

試試這個:

 const value="-99,1,2,4,-1,,, ,0,, 11" const toArrayOfNumber = str => str.split(',').map(num => num.trim() && Number(num)).filter(num => !Number.isNaN(num) && typeof num != 'string'); const nums = toArrayOfNumber(value); nums.forEach(num => console.log(typeof num, num)); 

我們使用trim的結果來確定我們是否應該像數字一樣處理它。 如果沒有,那么我們只有一個string ,並被過濾掉。

您也可以通過Array.reduce執行此操作,在每次迭代中,您使用isNaN檢查parseInt

 let data = "1,2,4,-1,,, ,0, 11" let r = data.split(',').reduce((r,c) => isNaN(parseInt(c)) ? r : [...r, +c],[]) console.log(r) 

這樣,您只能iterate over the array once分割后iterate over the array once 這也將保持零完整,只丟棄任何非數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM