如何将逗号分隔的字符串安全地转换为数字数组

时间:2019-05-21 15:30:02

标签: javascript arrays type-conversion

修改

为什么这不是重复的

此问题专门解决了使用0将空字符串以及任意数量的空格字符转换为Number(str)的问题。

看看下面的代码片段:

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>

这很尴尬,我希望有一个显而易见的更好的解决方案,我看不到。

4 个答案:

答案 0 :(得分:2)

@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

答案 1 :(得分:2)

如果您仅处理整数,则以下内容也将起作用。将保留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));

答案 2 :(得分:1)

您也可以通过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个帖子拆分。同样,这将使零保持不变,并且仅丢弃任何非数字。

答案 3 :(得分:0)

尝试一下:

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,它就会被过滤掉。