2012-02-18 68 views
18

我有一个数字(坐标)数组,我想显示使用JSON像这样如何减少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}] 

有没有一种方法可以轻松地沟渠存在微不足道的数字?

+1

这是一个很好的问题 – 2012-02-18 08:48:40

回答

31

本地JSON.stringify接受参数replacer,它可以是一个功能转换值需要什么:

a = [0.123456789123456789] 
JSON.stringify(a, function(key, val) { 
    return val.toFixed ? Number(val.toFixed(3)) : val; 
}) 

>> "[0.123]" 
+0

谢谢!这就是我一直在寻找的! – 2012-02-18 11:44:29

+0

+1 - 非常酷,不知道存在。 – 2012-02-19 01:27:01

+0

很棒的回答。如果您要转换GeoJSON文件,只需添加一小部分:上述内容不仅可以转换坐标,还可以转换所有属性。因此,我在return语句之前加了'''if(isNaN(+ key))return val;'',因为数组中的键是它的索引。 – 2015-10-06 05:49:38

0

运行您的阵列并将以下内容应用于所有值。

value = Math.round(value * 10000)/10000; 

另一种可能性是将您的坐标内部存储为int值(10^-4的倍数)并将其转换为输出。

+1

这是行不通的在许多(大多数情况下)情况下(因为浮点数字在内部存储) – 2012-02-18 09:03:22

8

使用Number#toPrecisionNumber#toFixed,以适合您的需求为准。区别在于toFixed设置小数点后的位数,并且toPrecision设置整数位数。

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

注意toFixedtoPrecision返回字符串,所以你可能会想JSONifying之前将其转换回数字。

以下是强制性MDN link


你也可以做这样的事情,如果你想推出自己的。

Math.round(1.98765432 * 10000)/10000 // 1.9877 

在函数封装,它可能是这个样子:

function precisify(n, places) { 
    var scale = Math.pow(10, places); 
    return Math.round(n * scale)/scale; 
} 
+2

请注意,toFixed和toPrecision都返回字符串,而不是数字。所以,你需要施放(通过用一个单一的'+'作为前缀)来将它们保存为数字。 – djd 2012-02-18 09:35:33

+0

@Dave,好点。它不适合我的简单例子,所以我把它排除了,但我想我应该提及它。 – 2012-02-18 09:38:14

3

,想到的第一个办法是预先处理阵列的所有数字四舍五入到四位:

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() function返回一个字符串,所以我使用了一元加运算符将其转换回数字。

想到的第二种方法是通过JSON.stringify()处理字符串输出:

json = json.replace(/(\.\d{4})(\d+)/g,"$1"); 
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]); 
       } 
      } 
     } 
    } 
} 

享受自己

+0

对这个问题的答案数量非常多。我认为我最喜欢你的选择,因为它是最通用的。我希望JSON的stringify中有更多的参数选项,但显然这是不可能的。 – 2012-02-18 09:01:47