Сумма значений за месяц из массива объектов в JavaScript - PullRequest
0 голосов
/ 10 июня 2018

У меня есть массив таких объектов:

var json = [ { day: '01-01-2018', hour: '00:00', value: '121' }, { day: '01-02-2018', hour: '05:24', value: '131' }, { day: '26-01-2018', hour: '00:07', value: '101' }, { day: '16-02-2018', hour: '08:02', value: '56' }, { day: '20-02-2018', hour: '12:02', value: '123' }, { day: '24-03-2018', hour: '10:11', value: '45' }];

Я хотел бы изменить формат даты с ДД-ММ-ГГГГ на ГГГГ-ММ-ДД, а затем суммировать значения в месяц, чтобы создатьграфик.

Моя попытка:

var mapDateVolume = [];

 for (var i = 0; i < json.length; i++)
        {
            var allDate = json[i].day;
            var oneVolume = json[i].value;
            var splitedDate = allDate.split("-");
            var newOrderY = splitedDate[2] + "-" 
            var newOrderM = splitedDate[1] + "-";
            var newOrderD = splitedDate[0];
            var newOrderAllDate = newOrderY + newOrderM + newOrderD;  

            var newOrder = {};
            newOrder[newOrderAllDate] = oneVolume;
            mapDateVolume.push(newOrder);

        }

var result = [];

        for (var i = 0; i < mapDateVolume.length; i++){

            var key = Object.keys(mapDateVolume)[i].split("-")[0] + "/";
            key += Object.keys(mapDateVolume)[i].split("-")[1];
            var value = Object.values(mapDateVolume)[i];
            var oldValue = Object.keys(result)[i] != null ? Object.keys(result)[i] : 0;

            var newResult = {};
            newResult[key] = value;
            result.push(newResult);
        }

        for (var i = 0; i < result.length; i++) {

            xAxis.push(Object.keys(result)[i]);
            yAxis.push(Object.values(result)[i]);

        }

Я использую Chart.js и он отлично работает с днями:

 for ( var i = 0; i < jsonAll.length; i++ )
 {

   xAxis.push(json[i].day+'-'+json[i].hour);
   yAxis.push(json[i].value);

 }

Я знаю, что с этой суммой что-то не такпотому что я вижу только пустой график.К сожалению, у меня мало опыта работы с JavaScript.

1 Ответ

0 голосов
/ 10 июня 2018

Прежде всего, давайте отформатируем всю коллекцию (массив данных).

Нам нужно:

  1. Формат даты: DD-MM-ГГГГ до ГГГГ-ММ-ДД .
  2. Свойство-значение - это строка типа, нам нужно это как число .

Простой с Array#Map:

const collection = data.map(x => ({ ...x, day: x.day.split("-").reverse().join("-"), value: Number(x.value)}));

Далее нужно снова использовать Array#Map для замены свойства дня на Месяц .

const mapDayToMonth = collection.map(x => ({...x, day: new Date(x.day).getMonth()}));

Метод getMonth() возвращает месяц (от 0 до 11) для указанной даты в соответствии с местным временем.Итак, 0 - января , 1 - февраля ... и т. Д.

Последний шаг Array#Reduce для суммирования значений за Месяц :

const sumPerMonth = mapDayToMonth.reduce((acc, cur) => {
  acc[cur.day] = acc[cur.day] + cur.value || cur.value;
  return acc;
}, {})

Полный пример JSFiddle :

const data = [ { day: '01-01-2018', hour: '00:00', value: '121' }, { day: '01-02-2018', hour: '05:24', value: '131' }, { day: '26-01-2018', hour: '00:07', value: '101' }, { day: '16-02-2018', hour: '08:02', value: '56' }, { day: '20-02-2018', hour: '12:02', value: '123' }, { day: '24-03-2018', hour: '10:11', value: '45' }];

    const collection = data.map(x => ({ ...x, day: x.day.split("-").reverse().join("-"), value: Number(x.value)}));

    console.log(collection);

    const mapDayToMonth = collection.map(x => ({...x, day: new Date(x.day).getMonth()}));

    console.log(mapDayToMonth);

    const sumPerMonth = mapDayToMonth.reduce((acc, cur) => {
      acc[cur.day] = acc[cur.day] + cur.value || cur.value; // increment or initialize to cur.value
      return acc;
    }, {})

    console.log(sumPerMonth)

Полезные ссылки:

Карта массива

Уменьшение массива

Числовой объект

Синтаксис спреда

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