如何将一个字符串split()到一个整数数组

时间:2016-08-12 06:35:20

标签: javascript arrays string split integer

我有一个应该作为数组执行的字符串:

var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',');

如果我使用split(),它将创建一个字符串数组:

[‘The’, '1', '2', ‘Fox’, ‘Jumped’, '3', ‘Over’, '4'] 

我不需要那个。我需要一个像:

这样的数组
[‘The’, 1, 2, ‘Fox’, ‘Jumped’, 3, ‘Over’, 4]

表示哪个是字符串,哪个是数字。

9 个答案:

答案 0 :(得分:14)

一个选项是使用Number构造函数返回一个数字或NaN

var res = q.split(',').map(el => {
  let n = Number(el);
  return n === 0 ? n : n || el;
});

// > "The, 1, 2, Fox, Jumped, 3.33, Over, -0"
// < ["The", 1, 2, " Fox", " Jumped", 3.33, " Over", -0]

编辑:如果上述情况令人困惑,您可以使用Bergi建议的以下条件替换它:

return isNaN(n) ? el : n;

如果您想修剪字符串元素,您还可以使用String.prototype.trim方法:

return isNaN(n) ? el.trim() : n;

答案 1 :(得分:4)

var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',');

您可以使用Array.map,它返回一个新数组

var newAr = z.map(item => parseInt(item) ? parseInt(item) : item); 

将输出

[“The”,1,2,“Fox”,“Jumped”,3,“Over”,4]

答案 2 :(得分:4)

&#13;
&#13;
//from the linked SO answer
function isNumeric(n) { 
  return !isNaN(parseFloat(n)) && isFinite(n);
}

var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.trim().split(/\s*,\s*/).map(function(word) {
  return isNumeric(word) ? Number(word) : word;
});

console.log(z);
&#13;
&#13;
&#13;

这是如何工作的?

isNumeric

值得注意的是,您需要一种方法来检测数字是什么,不是数字。我建议使用here显示的实现(与我的例子相同),因为它的功能强大且不会产生误报或漏报。这里的许多答案将忽略一些有效数字(例如,+3-3)或解析无效的数字(例如"")。

假设您有一个名为isNumeric()的函数,它返回一个布尔值,表示输入是否为数字。如果需要,您可能需要更改实施以满足您的需求,例如,如果您只想使用整数或仅使用正数。

分裂成单独的单词

您需要将字符串分成单独的单词块。这是以下列方式完成的

var input = " The, 1, 2 , Fox  , Jumped  , 3, Over, 4     ";
input.trim() //make sure there are no beginning and ending spaces
    .split(/\s*,\s*/); //split on a comma surrounded by any amount of spaces. That removes spaces from start/end of each of the words
//["The", "1", "2", "Fox", "Jumped", "3", "Over", "4"]

使用.map

可以在数组上运行map() method以将其转换为新数组。我们通过使用回调函数转换每个元素来完成。给出的回调只是检查一个单词是否实际上是一个数字 - 如果是,它使用Number将其解析为一个数字,用于显式类型转换。请注意,您不应该new Number(word)创建Number 对象,而不是数字基元类型。

注意隐式转换可以使用+ operator来完成。例如:

+"500" //500
+"hello" //NaN

在我的回答的开头可以使用+word代替Number(word),但我发现显式转换更容易理解。

答案 3 :(得分:4)

  1. 您可以使用Number函数将Stringified数字转换为实际数字。
  2. Number函数将返回NaN,如果它无法将字符串转换为数字。
  3. 你可以利用这两个事实来编写类似的东西

    "The, 1, 2, Fox, Jumped, 3, Over, 4".split(/\s*,\s*/g).map(d => Number(d) || d);
    // [ 'The', 1, 2, 'Fox', 'Jumped', 3, 'Over', 4 ]
    

    由于NaN为Falsy(Boolean(NaN)false),如果Number无法将字符串转换为数字,则会返回实际值原样。

答案 4 :(得分:3)

这可以通过迭代每个数组项(通过,字符拆分)并使用map(predict)函数来实现。如果它们可以作为int解析,则可以测试每个项目。

var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = q.split(',').map(i => !isNaN(parseInt(i)) ? parseInt(i) : i);

高尔夫球::)

p=parseInt,q="The, 0 , 2, Fox, Jumped, 3, Over, 4",z=q.split(',').map(i=>!isNaN(p(i))?p(i):i);

答案 5 :(得分:3)

我会迟到但检查了所有的答案,没有人检查过所有案例,例如:1.311 Balls ..等等。你也没有trim这些单词的额外空格,它应该被包括在内,否则我们无法获得OP要求的预期结果。

而且parseFloat要好得多,因为你不会丢失小数:

var q = "The, 1, 2 fd, Fox, 3.12, Jumped, -3, Over, 4";

var z = q.split(',').map(function(i){
    i = i.trim();
    var reg = /^-?\d+\.?\d*$/;

    if (reg.test(i))
        return parseFloat(i);
    return i;
});

console.log(z);

结果将是:

["The", 1, "2 fd", "Fox", 3.12, "Jumped", -3, "Over", 4]

请参阅Fiddle

答案 6 :(得分:3)

利用+string转化为数字的方式。

var q = "The, 1, 2, Fox, Jumped, 3, Over, 0";
var r = q.split`, `.map(x=>+x||x==0?+x:x);
console.log(r);

答案 7 :(得分:2)

我尝试使用forEach进行循环,并通过isNaN:return true if not number,return false if number检查是否为数字推送新数组...

var q = "The, 1, 2, Fox, Jumped, 3, Over, 4";
var z = [];
q.split(',').forEach(function(v,k){
       isNaN(v) ? z.push(v) : z.push(parseInt(v));
});
console.log(z);

答案 8 :(得分:2)

您可以使用for..of循环.test()/\d/作为参数

var res = []; for (p of q.split(",")) [...res] = [...res, /\d/.test(p) ? +p : p];