#javascript #arrays #object #rounding
#javascript #массивы #объект #округление
Вопрос:
У меня есть динамический ответ от API, который каждый раз может иметь разные ответы. Мне нужно перебрать массив объектов и найти значения типа numbers. Затем округлите их до двух знаков после запятой. Из приведенных ниже примеров значения ключа объекта могут каждый раз отличаться.
Возможные ответы от API:
response = [
{
case: "abc",
price: "123.1234",
manager: "joe black",
duration: "3456.1231321"
},
{
case: "bbb",
price: "23.4897987",
manager: "jill smith",
duration: "78974.12156464"
}
]
or
response = [
{
case: "apl",
yield: "90.1209312093",
average: "100.123,
},
{
case: "ltl",
yield: "80666.23131313",
average: "4512.7897987,
}
]
Ожидаемый результат:
response = [
{
case: "abc",
price: "123.12",
manager: "joe black",
duration: "3456.12"
},
{
case: "bbb",
price: "23.49",
manager: "jill smith",
duration: "78974.12"
}
]
or
response = [
{
case: "apl",
yield: "90.12",
average: "100.12,
},
{
case: "ltl",
yield: "80666.23",
average: "4512.79,
}
]
Комментарии:
1. Вы можете использовать
Object.entries()
Ответ №1:
Как и предлагалось, вы можете использовать Object.entries(), чтобы получить все отдельные пары ключ / значение в каждом элементе массива. Затем вы можете перебрать их и проверить на наличие чисел. Любое найденное число может быть округлено до двух знаков после запятой, а запись обновлена в исходном массиве.
Что-то вроде:
let response = [
{
case: "abc",
price: "123.1234",
manager: "joe black",
duration: "3456.1231321"
},
{
case: "bbb",
price: "23.4897987",
manager: "jill smith",
duration: "78974.12156464"
},
{
case: "apl",
yield: "90.1209312093",
average: "100.123"
},
{
case: "ltl",
yield: "80666.23131313",
average: "4512.7897987"
}
]
response.forEach(function(r){
let rValues = Object.entries(r);
rValues.forEach(function(e){
// e[0] is the key and e[1] is the value
let n = Number(e[1]);
if (!isNaN(n)) {
r[e[0]] = n.toFixed(2);
}
})
})
console.log(response);
Ответ №2:
Вы можете пройти через все объекты массива с помощью map() и через все ключи с помощью Object.keys().forEach . Затем проанализируйте все значения с плавающей запятой, если строка значений содержит число. Наконец, округлите значение с плавающей точкой с помощью toFixed(), которое возвращает округленное значение с плавающей точкой, преобразованное в строку.
let response1 = [{
case: "abc",
price: "123.1234",
manager: "joe black",
duration: "3456.1231321"
},
{
case: "bbb",
price: "23.4897987",
manager: "jill smith",
duration: "78974.12156464"
}
]
let response2 = [{
case: "apl",
yield: "90.1209312093",
average: "100.123",
},
{
case: "ltl",
yield: "80666.23131313",
average: "4512.7897987"
}
]
function round(array) {
let rounded = array;
rounded.map((el) => {
Object.keys(el).forEach(function(key) {
if (!isNaN(parseFloat(el[key]))) {
el[key] = parseFloat(el[key]);
el[key] = el[key].toFixed(2);
}
});
})
console.log(rounded);
}
round(response1);
round(response2);