Создать таблицу из добавленных данных, отсортированных по месяцам - PullRequest
0 голосов
/ 27 мая 2020

У меня проблема с сортировкой данных и получением массива с нужными данными. Вот ситуация:

Я получаю таблицу данных, представляющих счета-фактуры (дата создания и цена) в этом формате:

invoices: [
  0: {
    amount: 200,
    created_at: 1590572830425
  },
  1: {
    amount: 799,
    created_at: 1590572847553
  }
  ...
]

Я бы хотел oop в этой таблице счетов-фактур и извлечь общую сумму счетов-фактур по месяцам года (благодаря полям created_at, представляющим временную метку.

В конце я хотел бы получить таблицу с 12 Максимальные значения, представляющие общую сумму счетов-фактур с разбивкой по месяцам

Ожидаемый результат: [300, 450, 799, 650, 288, 400, 643, 809, 1073, 499, 640, 600]

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 27 мая 2020

Поскольку вы не хотите, чтобы суммы смешивались в разные годы, было бы лучше получить результат, в котором перечислены соответствующие годы, а затем для каждого года иметь 12 сумм:

function monthTotals(invoices) {
    let totals = {};
    for (let {created_at, amount} of invoices) {
        let date = new Date(created_at);
        let year = date.getFullYear();
        (totals[year] = (totals[year] || Array(12).fill(0)))[date.getMonth()] += amount;
    }
    return totals;
}

let invoices = [{
    amount: 200,
    created_at: 1590572830425
},{
    amount: 799,
    created_at: 1590572847553
}];

console.log(monthTotals(invoices));
1 голос
/ 27 мая 2020

Вот так. Сначала я сделал сокращение, но это было излишним

Это решение не будет работать через годы

const invoices = [{
    amount: 200,
    created_at: 1590572830425
  },
  {
    amount: 799,
    created_at: 1590572847553
  }
];

const monthVal = new Array(12).fill(0);
invoices.forEach(item => {
  const month = new Date(item.created_at).getMonth();
  monthVal[month] += item.amount;
});

console.log(monthVal)
1 голос
/ 27 мая 2020

Если можете, старайтесь всегда давать реальную комбинацию ввода и вывода, то есть те, которые совпадают (ввод соответствует ожидаемому выводу), чтобы мы могли запустить его и протестировать наш вывод с ожидаемым выводом. Также, часто известный как минимально воспроизводимый пример ({ ссылка }):

const invoices = [
  {
    amount: 200,
    created_at: 1590572830425
  },
  {
    amount: 799,
    created_at: 1590572847553
  }
]

const outputArr = [0,0,0,0,0,0,0,0,0,0,0,0];

invoices.forEach(item => {  
  const myDate = new Date(item.created_at);
  console.log(myDate.toDateString())
  const month = parseInt(myDate.getMonth());  
  outputArr[month] += item.amount  
});

console.log(outputArr);

Вывод:

[0,0,0,0,999,0,0,0,0,0,0,0]
0 голосов
/ 27 мая 2020

Также вы можете суммировать весь процесс в методе reduce.

var invoices = [ {amount: 200,created_at: 1590572830425},{amount: 799,created_at:1590572847553}];

var result = invoices.reduce((acc, elem)=>{
  month = new Date(elem.created_at).getMonth();
  acc[month] += elem.amount;
  return acc;
},Array.from({length:12}, ()=>0));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...