我有一个这样的字符串:
string = "[x,y,z]"
其中x
、y
和z
是有效的 javascript 浮点数作为字符串。一些例子:
-0.9999
1.
1.00000000000E-5
-1E5
在不使用 Eval 的情况下将此字符串解析为实际的 javascript 浮点数数组的最有效(最快)方法是什么?
现在我这样做:
parseFloatArray = function(string){
// isolate string by removing square brackets
string = string.substr( 1, string.length-2 )
// create array with string split
var array = string.split(',');
// parse each element in array to a float
for (var i = 0, il = array.length; i < il; i++){
array[i] = parseFloat(array[i]);
}
// return the result
return array
}
对于上述示例,解决方案必须正常工作,这一点很重要。
我也尝试了一开始看起来很完美的JSON.parse
,但它为第二个示例返回了一个 SyntaxError 1.
其中小数分隔符后面没有任何内容。
我准备了一个小提琴进行测试。
而不是这个
array[i] = parseFloat(array[i]);
尝试 array[i] = +array[i];
上面很好地处理了所有测试用例。
这是工作小提琴
试试这个:
str = "[-0.9999, 1., 1.00000000000E-5,-1E5]";
str.slice(1, str.length-1).split(',').map(Number);
// [-0.9999, 1, 0.00001, -100000]
语法是parseFloat(string)。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/parseFloat
如果您认为输入值只是数字,则可以使用 Number(x) 而不是 parseFloat。
此外,您可能会在解析时获得不同的值,因为所有浮点数学都基于 IEEE [754] 标准。 所以使用 toPrecision() 方法来自定义你的值 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Number/toPrecision。
与其编写 for 循环,不如始终使用 array.prototype 中内置的 javascript。
var string = "[1.,-0.9999,-1.00000E-5]";
var array = string.substr( 1, string.length-2 ).split(',');
console.log(array.map(function(i){return parseFloat(i);}));
你也可以使用一元运算符代替parseFloat()。
console.log(array.map(function(i){return +i;}));
最有效的提取是替换和拆分。
var str = "[312.413,436.6546,34.1]"; // string
str = () => str.replace(/[|]/g, "").split(","); //[312.413, 4...] Array
最有效的解析只是在字符串前面加上"+",这将对其进行计数,并且由于 JavaScript 将浮点数作为原语(而不是整数)处理,因此它们将被自动解析。
var a = "1.00000000000E-5";
console.log( +a ); // 0.00001