簡體   English   中英

將字符串轉換為整數數組

[英]convert string into array of integers

我想將以下字符串'14 2'轉換為兩個整數的數組。 我該怎么做 ?

適用於現代瀏覽器的快速瀏覽器:

'14 2'.split(' ').map(Number);

// [14, 2]`

您可以.split()獲取字符串數組,然后循環將它們轉換為數字,如下所示:

var myArray = "14 2".split(" ");
for(var i=0; i<myArray.length; i++) { myArray[i] = +myArray[i]; } 
//use myArray, it's an array of numbers

+myArray[i]只是進行數字轉換的一種快速方法,如果您確定它們是整數,您可以這樣做:

for(var i=0; i<myArray.length; i++) { myArray[i] = parseInt(myArray[i], 10); } 

所以......舊線程,我知道,但是......

編輯

@RoccoMusolino 有一個不錯的收獲; 這是一個替代方案:

特爾;博士:

 const intArray = [...("5 6 7 69 foo 0".split(' ').filter(i => /\d/g.test(i)))]

錯誤"5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6] "5 6 note this foo".split(" ").map(Number).filter(Boolean); // [5, 6]

這里列出的更優雅的解決方案有一個微妙的缺陷,特別是@amillara 和@Marcus 的其他漂亮的答案。

當字符串數組的元素不是整數時,可能會在沒有對輸入進行驗證的情況下出現問題。 對於一個人為的例子......

問題:


var effedIntArray = "5 6 7 69 foo".split(' ').map(Number); // [5, 6, 7, 69, NaN]

由於您顯然想要一個 PURE int 數組,這是一個問題。 老實說,直到我將 SO 代碼復制粘貼到我的腳本中時,我才發現這一點......:/


略少-控球)修正:


var intArray = "5 6 7 69 foo".split(" ").map(Number).filter(Boolean); // [5, 6, 7, 69]

所以,現在即使你有垃圾整數字符串,你的輸出也是一個純整數數組。 在大多數情況下,其他人真的很性感,但我確實想提供我最隨意的w'actually 不過,我的功勞是它仍然是單線...

希望它可以節省某人的時間!

var result = "14 2".split(" ").map(function(x){return parseInt(x)});

Tushar Gupta 答案的替代方法是:

'14 2'.split(' ').map(x=>+x);

// [14, 2]`

在代碼高爾夫中,您可以保存 1 個字符。 這里的“+”是“一元加”運算符,作用類似於 parseInt。

反對parseInt觀點:

不需要使用 lambdas 和/或為parseInt提供radix參數,只需使用parseFloatNumber


原因:

  1. 它正在工作:

     var src = "1,2,5,4,3"; var ids = src.split(',').map(parseFloat); // [1, 2, 5, 4, 3] var obj = {1: ..., 3: ..., 4: ..., 7: ...}; var keys= Object.keys(obj); // ["1", "3", "4", "7"] var ids = keys.map(parseFloat); // [1, 3, 4, 7] var arr = ["1", 5, "7", 11]; var ints= arr.map(parseFloat); // [1, 5, 7, 11] ints[1] === "5" // false ints[1] === 5 // true ints[2] === "7" // false ints[2] === 7 // true
  2. 它更短。

  3. parseInt -approach - 沒有時,它會更快一點並利用緩存

     // execution time measure function // keep it simple, yeah? > var f = (function (arr, c, n, m) { var i,t,m,s=n(); for(i=0;i++<c;)t=arr.map(m); return n()-s }).bind(null, "2,4,6,8,0,9,7,5,3,1".split(','), 1000000, Date.now); > f(Number) // first launch, just warming-up cache > 3971 // nice =) > f(Number) > 3964 // still the same > f(function(e){return+e}) > 5132 // yup, just little bit slower > f(function(e){return+e}) > 5112 // second run... and ok. > f(parseFloat) > 3727 // little bit quicker than .map(Number) > f(parseFloat) > 3737 // all ok > f(function(e){return parseInt(e,10)}) > 21852 // awww, how adorable... > f(function(e){return parseInt(e)}) > 22928 // maybe, without '10'?.. nope. > f(function(e){return parseInt(e)}) > 22769 // second run... and nothing changes. > f(Number) > 3873 // and again > f(parseFloat) > 3583 // and again > f(function(e){return+e}) > 4967 // and again > f(function(e){return parseInt(e,10)}) > 21649 // dammit 'parseInt'! >_<

注意:在 Firefox 中parseInt工作速度大約快 4 倍,但仍然比其他人慢。 總共: +e < Number < parseFloat < parseInt

首先在空格上拆分字符串:

var result = '14 2'.split(' ');

然后將字符串的結果數組轉換為整數:

for (var i in result) {
    result[i] = parseInt(result[i], 10);
}

如果數字可以用多個空格分隔,最安全的做法是將字符串拆分為一個或多個連續的空白字符(包括制表符和常規空格)。 使用正則表達式,這將是\\s+

然后,您可以使用Number函數map每個元素以對其進行轉換。 請注意, parseInt將不起作用(即arr.map(parseInt) ),因為map將三個參數傳遞給映射函數:元素、索引和原始數組。 parseInt接受基數或基數作為第二個參數,因此它最終會以索引為基數,通常會導致結果中有許多NaN 但是, Number忽略除第一個參數之外的任何參數,因此它可以直接工作。

const str = '1\t\t2   3 4';
const result = str.split(/\s+/).map(Number); //[1,2,3,4]

要刪除不是數字的元素,可以將Array#filterisNaN結合使用。

const str = '1\t\t2   3 ab  4 c';
const result = str.split(/\s+/).map(Number).filter(x => !isNaN(x)); //[1,2,3,4]

您還可以使用匿名函數進行映射回調,並使用一元加運算符將每個元素轉換為數字。

const str = '1\t\t2   3 4';
const result = str.split(/\s+/).map(x => +x); //[1,2,3,4]

通過回調的匿名函數,您可以決定使用哪些參數,因此parseInt也可以工作。

const str = '1\t\t2   3 4';
const result = str.split(/\s+/).map(x => parseInt(x)); //[1,2,3,4]

只是為了好玩,我想我也會拋出一個forEach(f())解決方案。

var a=[];
"14 2".split(" ").forEach(function(e){a.push(parseInt(e,10))});

// a = [14,2]
let idsArray = ids.split(',').map((x) => parseInt(x));

更好的一行解決方案:

var answerInt = [];
var answerString = "1 2 3 4";
answerString.split(' ').forEach(function (item) {
   answerInt.push(parseInt(item))
});

我們拆分功能

var splitresult = "14 2".split(" ");

暫無
暫無

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

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