我有一个应该作为数组执行的字符串:
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]
表示哪个是字符串,哪个是数字。
答案 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)
//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;
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)
Number
函数将Stringified数字转换为实际数字。Number
函数将返回NaN
,如果它无法将字符串转换为数字。你可以利用这两个事实来编写类似的东西
"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.3
,11 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];