Показать сообщение отдельно
  #1 (permalink)  
Старый 02.08.2021, 16:51
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

Как оптимизировать функцию подсчёта данных?
Всем привет. У меня есть задача написать следующую функцию:
Данные, которые приходят на вход:
const array = [
  {
    '2021-07-01': {
      'products': [1661.28, 229],
    },
  },
  {
    '2021-07-02': {
      'fare': [66, 78],
      'products': 218,
    }
  },
  {
    '2021-07-03': {
      'fare': 78,
      'products': 909.80,
    }
  },
  {
    '2021-07-05': {
      'water': 840,
      'products': 1021.61,
    },
  },
]


Данные, которые необходимо получить:
[
  { '2021-07-01': '1890.28' },
  { '2021-07-02': '362.00' },
  { '2021-07-03': '987.80' },
  { '2021-07-05': '1861.61' },
  { total: '5101.69' },
  { fare: '222.00', products: '4039.69', water: '840.00' }
]


Функция считает сумму за день, общую сумму, и общую сумму за каждую позицию. В целом, в условии никаких подвохов нет

Моё решение:
const array = [
  {
    '2021-07-01': {
      'products': [1661.28, 229],
    },
  },
  {
    '2021-07-02': {
      'fare': [66, 78],
      'products': 218,
    }
  },
  {
    '2021-07-03': {
      'fare': 78,
      'products': 909.80,
    }
  },
  {
    '2021-07-05': {
      'water': 840,
      'products': 1021.61,
    },
  },
]

const calculate = array => {

  const digits = 2;

  let total = 0;

  let object = {};

  const output = array.reduce((accumulator, currentValue, index, array) => {

    const prop = {};

    const date = Object.keys(currentValue)[0];

    for (const value of Object.keys(currentValue[date])) {
      if (!object[value]) {
        object[value] = 0;
      }

      object[value] += sum(currentValue[date][value]);
    }

    prop[date] = sum(Object.values(currentValue[date]).flat()).toFixed(digits);

    total += sum(Object.values(currentValue[date]).flat());

    accumulator.push(prop);

    if (index === array.length - 1) {
      accumulator.push({
        total: total.toFixed(digits)
      });
    }

    return accumulator;
  }, []);

  output.push(Object.keys(object).sort().reduce((accumulator, currentValue) => {
    accumulator[currentValue] = object[currentValue].toFixed(digits);
    return accumulator;
  }, {}));

  return output;
};

const sum = input => {
  if (Array.isArray(input)) {
    return input.reduce((accumulator, currentValue) => accumulator += currentValue, 0);
  }

  return input;
};

console.log(calculate(array));


Подскажите, как решение можно оптимизировать?

Последний раз редактировалось dc65k, 02.08.2021 в 18:06.
Ответить с цитированием