[英]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
參數,只需使用parseFloat
或Number
。
原因:
它正在工作:
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
它更短。
當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#filter
與isNaN
結合使用。
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.