Подтвердить что ты не робот

Как уменьшить значение чисел в 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}]

Есть ли способ легко отбросить оставшиеся незначительные числа?

4b9b3361

Ответ 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) и просто конвертировать их для вывода.