Исправлено после использования метода Reduce JS - PullRequest
0 голосов
/ 17 марта 2020

Я проезжаю через массив и сокращаю 50 пунктов до 1 - их сумму. Эти 50 предметов являются числами с плавающей точностью. Пожалуйста, помогите, я не понимаю, где на этой карте я должен поставить toFixed (2), чтобы получить правильное свойство summaryIncome, а не что-то вроде этого: 39990,89999999999913.

var data = [
  {id: 1, incomes: [{value:1}, {value: 2}]}, 
  {id: 2, incomes: [{value:2}, {value: 3}]}],
  ...
]

var summary = data.map(item => ({
  ...item,
  summaryIncome: item.incomes.reduce((acc, income) =>
    acc += income.value, 0)
}));

1 Ответ

3 голосов
/ 17 марта 2020

Чтобы сохранить точную сумму, позвоните toFixed после суммирования всех value s:

var data = [
  {id: 1, incomes: [{value: 0.1}, {value: 0.2}]}, 
  {id: 2, incomes: [{value:2}, {value: 3}]},
]

var summary = data.map(item => ({
  ...item,
  summaryIncome: item.incomes.reduce((acc, income) => acc + income.value, 0).toFixed(2)
}));
console.log(summary);

К при необходимости ставить только десятичные точки :

var data = [
  {id: 1, incomes: [{value: 0.1}, {value: 0.2}]}, 
  {id: 2, incomes: [{value:2}, {value: 3}]},
]

var summary = data.map(item => ({
  ...item,
  summaryIncome: (() => {
    const trueSum = item.incomes.reduce((acc, income) => acc + income.value, 0);
    return Number.isInteger(trueSum) ? String(trueSum) : trueSum.toFixed(2);
  })()
}));
console.log(summary);
...