Обновите все значения объектов, чтобы они были округлены на два десятичных знака

#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);