如何在处理含字符串与数字的二维数组时保留数字类型
嘿,这个数字类型被转成字符串的问题我太熟了!大概率是你代码里的j()函数在搞鬼——我猜它是某种序列化/反序列化工具(比如JSON.parse或者自定义的解析函数),把原本的数字给转成字符串了。咱们一步步解决:
先搞清楚问题根源
你原数组里的元素20180427000000、25528本来是数字类型,但经过j(data[n].slice(1,3))这一步后变成了字符串。这说明j()函数在处理过程中做了字符串化再解析的操作,破坏了原本的类型。
解决方案分两种情况
情况1:j()是多余的调用(最常见)
如果你的data本身就是已经解析好的二维数组(像你给出的示例那样),那data[n].slice(1,3)直接就能得到包含原始数字的子数组,完全不需要用j()去解析。直接修改代码就行:
let n = 1; const Linearray = []; // 简化原代码里的(data.length)-2写法 while (n < data.length - 2) { // 去掉j(),直接获取slice后的数组,数字类型完美保留 const DailyDemand = data[n].slice(1, 3); // 举个例子:你可以直接用这些数字做计算或者存储 const [timestamp, demand] = DailyDemand; console.log(typeof timestamp); // 输出"number",类型没丢! Linearray.push({ timestamp, demand }); n++; }
情况2:必须处理字符串形式的数字(比如数据从后端字符串解析而来)
如果你的data里的数字本来就是字符串(比如后端返回的JSON里把数字存成了字符串),那我们可以手动把这些字符串转成数字。推荐两种方式:
方法A:遍历转换
处理DailyDemand的时候,把每个元素判断后转成数字:
while (n < data.length - 2) { const rawDemand = data[n].slice(1, 3); // 遍历子数组,只把字符串数字转成Number类型 const DailyDemand = rawDemand.map(item => { // 避免把"VD"这类非数字字符串转成NaN if (typeof item === 'string' && !isNaN(item) && !isNaN(parseInt(item, 10))) { return Number(item); } return item; }); Linearray.push(DailyDemand); n++; }
方法B:用JSON.parse的reviver函数(如果数据来自JSON字符串)
如果你的data是从JSON字符串解析来的,那在解析时就可以指定reviver函数自动转换数字:
// 假设rawData是后端返回的JSON字符串 const data = JSON.parse(rawData, (key, value) => { // 判断是否是可转换为数字的字符串,且转换后不丢失精度 if (typeof value === 'string' && !isNaN(value)) { // 像20180427000000这样的大数字,在JavaScript的数字安全范围内(小于2^53-1),可以放心转 return Number(value); } return value; });
最后提醒
尽量避免不必要的序列化/反序列化操作——这不仅会丢失类型,还会影响性能。你的原数组已经是结构化的二维数组,直接操作元素就好啦!
内容的提问来源于stack exchange,提问作者adam Wadsworth
相关产品推荐
相关产品推荐

