Как уменьшить значение чисел в JSON 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}]
Есть ли способ легко отбросить оставшиеся незначительные числа?
Ответы
Ответ 1
Native JSON.stringify принимает параметр replacer
, который может быть функцией, преобразующей значения во все необходимое:
a = [0.123456789123456789]
JSON.stringify(a, function(key, val) {
return val.toFixed ? Number(val.toFixed(3)) : val;
})
>> "[0.123]"
Ответ 2
Используйте Number#toPrecision
или Number#toFixed
, в зависимости от ваших потребностей. Разница в том, что toFixed
задает число цифр после десятичной точки, а toPrecision
задает все количество цифр.
var foo = 1.98765432;
console.log(foo.toPrecision(5)); // 1.9877
Обратите внимание, что строки toFixed
и toPrecision
возвращают строки, поэтому вы, вероятно, захотите преобразовать их обратно в номера перед их JSONifying.
Здесь обязательная ссылка 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;
}
Ответ 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()
возвращает строку, поэтому я использовал оператор унарного плюса для преобразования этого числа обратно в число.
Второй способ, который приходит на ум, - обработать вывод строки с помощью JSON.stringify()
:
json = json.replace(/(\.\d{4})(\d+)/g,"$1");
Ответ 4
Немного перебор, но это должно работать во всех ситуациях.
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]);
}
}
}
}
}
Наслаждайтесь
Ответ 5
Запустите массив и примените следующие значения ко всем значениям.
value = Math.round( value * 10000 ) / 10000;
Другая возможность заключается в том, чтобы хранить ваши координаты внутри себя как значения int (кратные 10 ^ -4) и просто конвертировать их для вывода.