2012-02-18 34 views
18

Tôi có một mảng với những con số (tọa độ) và tôi muốn hiển thị những người sử dụng JSON như vậylàm thế nào để giảm bớt tầm quan trọng số trong stringify JSON của

JSON.stringify(array); 

mảng của tôi trông giống như:

[{"x":-0.825,"y":0}, 
{"x":-1.5812500000000003,"y":-0.5625}, 
{"x":-2.2515625000000004,"y":-1.546875}] 

Nhưng tôi chỉ quan tâm đến mục đầu tiên (cho phép nói) 4 chữ số có nghĩa, tức là

[{"x":-0.825,"y":0}, 
{"x":-1.5813,"y":-0.5625}, 
{"x":-2.2516,"y":-1.5469}] 

Có cách nào để dễ dàng bỏ lại các số không đáng kể?

+1

Đây là một câu hỏi hay –

Trả lời

31

Native JSON.stringify chấp nhận tham số replacer, mà có thể là một chức năng chuyển đổi các giá trị cho bất cứ điều gì là cần thiết:

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

>> "[0.123]" 
+0

Cảm ơn bạn! Đây là những gì tôi đang tìm kiếm !! –

+0

+1 - Rất tuyệt, không có ý tưởng nào tồn tại. –

+0

Câu trả lời hay. Chỉ cần một bổ sung nhỏ trong trường hợp bạn đang chuyển đổi một tập tin GeoJSON: ở trên sẽ không chỉ biến đổi tọa độ, mà còn tất cả các thuộc tính. Vì vậy, tôi đã thêm '' 'if (isNaN (+ key)) trả về val;' '' trước câu lệnh return, vì khóa trong mảng là chỉ mục của nó. –

0

Chạy qua mảng của bạn và áp dụng các điều sau cho tất cả các giá trị.

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

Một khả năng khác là lưu trữ tọa độ của bạn nội bộ dưới dạng giá trị int (bội số của 10^-4) và chỉ chuyển đổi chúng cho đầu ra.

+1

Đây không phải là đi làm việc trong nhiều trường hợp (nhiều nhất?) (vì cách các số dấu phẩy động được lưu trữ trong nội bộ) –

8

Sử dụng Number#toPrecision hoặc Number#toFixed, tùy theo điều kiện nào phù hợp với nhu cầu của bạn tốt hơn. Sự khác biệt là toFixed đặt số chữ số sau dấu thập phân và toPrecision đặt toàn bộ số chữ số.

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

Lưu ý rằng toFixedtoPrecision chuỗi lợi nhuận, vì vậy có thể bạn sẽ muốn chuyển đổi chúng trở lại số trước JSONifying họ.

Đây là nghĩa vụ bắt buộc MDN link.


Bạn cũng có thể làm điều gì đó tương tự, nếu bạn muốn tự cuộn.

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

gói gọn trong một chức năng, nó có thể trông giống như thế này:

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

Lưu ý rằng cả hai chuỗi trả về 'toFixed' và' toPrecision', không phải số. Vì vậy, bạn sẽ cần phải đúc (bằng cách bắt đầu với một '+') đơn nhất để giữ chúng dưới dạng số. – djd

+0

@Lưu, điểm tốt. Nó không thực sự phù hợp với các ví dụ đơn giản của tôi vì vậy tôi rời nó ra, nhưng tôi đoán tôi nên đề cập đến nó. –

3

Cách đầu tiên mà nói đến cái tâm là trước quá trình mảng để làm tròn tất cả các con số để bốn chữ số:

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 trả về một chuỗi, vì vậy tôi đã sử dụng toán tử cộng đơn để chuyển đổi thành số đó.

Cách thứ hai mà nói đến cái tâm là để xử lý chuỗi xuất bởi JSON.stringify():

json = json.replace(/(\.\d{4})(\d+)/g,"$1"); 
1

Một chút quá mức cần thiết, nhưng điều này sẽ làm việc trong mọi tình huống.

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]); 
       } 
      } 
     } 
    } 
} 

Thưởng thức chính mình

+0

Số câu trả lời cho câu hỏi này là, tốt, áp đảo. Tôi nghĩ rằng tôi thích lựa chọn của bạn tốt nhất cho đến nay vì nó là chung nhất. Tôi đã hy vọng cho các tùy chọn đối số bổ sung trong stringify JSON, nhưng rõ ràng điều này là không thể. –

Các vấn đề liên quan