如何减少数字'JSON's粘稠
how to reduce numbers' significance in JSON's stringify
我有一个带数字(坐标)的数组,我想像一样使用JSON来显示这些数组
JSON.stringify(array);
我的数组看起来像:
[{"x":-0.825,"y":0},
{"x":-1.5812500000000003,"y":-0.5625},
{"x":-2.2515625000000004,"y":-1.546875}]
但我只对前(比方说)4个有效数字感兴趣,即
[{"x":-0.825,"y":0},
{"x":-1.5813,"y":-0.5625},
{"x":-2.2516,"y":-1.5469}]
有没有办法轻易抛弃剩下的微不足道的数字?
Native JSON.stringify接受参数replacer
,它可以是一个将值转换为所需值的函数:
a = [0.123456789123456789]
JSON.stringify(a, function(key, val) {
return val.toFixed ? Number(val.toFixed(3)) : val;
})
>> "[0.123]"
使用Number#toPrecision
或Number#toFixed
,以更适合您的需求为准。不同之处在于toFixed
设置小数点后的位数,toPrecision
设置整个位数。
var foo = 1.98765432;
console.log(foo.toPrecision(5)); // 1.9877
请注意,toFixed
和toPrecision
返回字符串,因此您可能希望在对它们进行JSON化之前将它们转换回数字。
这是强制性的MDN链接。
如果你想自己滚,你也可以做这样的事情。
Math.round(1.98765432 * 10000) / 10000 // 1.9877
封装在一个函数中,它可能看起来像这样:
function precisify(n, places) {
var scale = Math.pow(10, places);
return Math.round(n * scale) / scale;
}
首先想到的方法是预处理数组,将所有数字四舍五入为四位数:
var array =[{"x":-0.825,"y":0},
{"x":-1.5812500000000003,"y":-0.5625},
{"x":-2.2515625000000004,"y":-1.546875}];
for (var i=0; i<array.length; i++){
array[i].x = +array[i].x.toFixed(4);
array[i].y = +array[i].y.toFixed(4);
}
var json = JSON.stringify(array);
// json === '[{"x":-0.825,"y":0},{"x":-1.5813,"y":-0.5625},{"x":-2.2516,"y":-1.5469}]'
.toFixed()
函数返回一个字符串,所以我使用了一元加号运算符将其转换回数字。
想到的第二种方法是处理JSON.stringify()
:输出的字符串
json = json.replace(/('.'d{4})('d+)/g,"$1");
有点过头了,但这应该适用于所有情况。
function prepareArrayForJSON(array) {
var i = 0;
while (i < array.length) {
if (typeof array[i] === 'number') {
array[i] = array[i].toPrecision(4);
} else if(typeof array[i] === 'object') {
if (array instanceof Object) {
prepareObjectForJSON(array[i]);
} else if (array instanceof Array) {
prepareArrayForJSON(array[i]);
}
}
}
}
function prepareObjectForJSON(obj) {
var i;
for (i in obj) {
if (obj.hasOwnProperty(i)) {
if (typeof obj[i] === 'number') {
obj[i] = obj[i].toPrecision(4);
} else if(typeof obj[i] === 'object') {
if (obj instanceof Object) {
prepareObjectForJSON(array[i]);
} else if (obj instanceof Array) {
prepareArrayForJSON(obj[i]);
}
}
}
}
}
享受
运行您的数组并将以下内容应用于所有值。
value = Math.round( value * 10000 ) / 10000;
另一种可能性是将坐标内部存储为int值(10^-4的倍数),然后将其转换为输出。
相关文章:
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JQuery解析JSON嵌套数组
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 如何使用json将对象列表从java转换为javascript
- 如何使用 node.js 比较两个 json 数组
- 如何将JSON数据导入我的ejs模板
- 区分JSON中的矩阵和列表列表
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 如何为json对象中的段发送array[]
- 根据id将json数组组合为一个json数组
- Json数据包含日期和时间格式
- AngularJS-在JSON选择器中使用变量名
- 如何减少数字'JSON's粘稠