如何减少数字'JSON's粘稠

how to reduce numbers' significance in JSON's stringify

本文关键字:粘稠 JSON 何减少 数字      更新时间:2023-09-26

我有一个带数字(坐标)的数组,我想像一样使用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#toPrecisionNumber#toFixed,以更适合您的需求为准。不同之处在于toFixed设置小数点后的位数,toPrecision设置整个位数。

var foo = 1.98765432; 
console.log(foo.toPrecision(5)); // 1.9877

请注意,toFixedtoPrecision返回字符串,因此您可能希望在对它们进行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的倍数),然后将其转换为输出。