Группируйте временные метки по дням недели и объединяйте данные - PullRequest
0 голосов
/ 08 июня 2018

Я создаю таблицу, которая будет функционировать как тепловая карта, показывающая совокупные значения (в данном случае продаж) на основе дня недели и часа.Ось Y таблицы - дни недели (Sun-Sat), а заголовок оси X / таблицы - часы 0-23.

При наличии нескольких дней, например, 2018-01-01 и 2018-01-08, оба понедельника, данные о продажах должны объединяться.Кроме того, после объединения этих дней могут быть дублированные часы, и в этом случае значения должны объединиться, чтобы показать совокупную стоимость (продажи) в этот час по понедельникам.

Если это имеет значение, этот проект находится в React.

Данные будут выглядеть так:

 data2: [
    {
        day: "2018-01-01",
        sales: [{hour: 6, value: 23}, {hour: 9, value: 164}]
    },
    {
        day: "2018-01-02",
        sales: [{hour: 3, value: 223}, {hour: 4, value: 12}]
    },
    {
        day: "2018-01-03",
        sales: [{hour: 7, value: 323}, {hour: 3, value: 86}]
    },
    {
        day: "2018-01-04",
        sales: [{hour: 5, value: 173}, {hour: 21, value: 65}]
    },
    {
      day: "2018-01-05",
      sales: [{hour: 12, value: 193}, {hour: 1, value: 53}]
    },
    {
      day: "2018-01-06",
      sales: [{hour: 15, value: 263}, {hour: 2, value: 56}]
    },
    {
      day: "2018-01-07",
      sales: [{hour: 18, value: 89}, {hour: 8, value: 378}]
    },
    {
      day: "2018-01-08",
      sales: [{hour: 6, value: 76}, {hour: 17, value: 398}]
    }
  ]

Я считаю, что мне нужно создать новый массив из этогоданные, чтобы упростить создание таблицы.До сих пор в componentDidMount () я использую moment.js, чтобы получить день недели каждой даты, но я не уверен, как лучше объединить дубликаты, а затем дубликаты часов.

Я подумал об использовании _underscore, но не могу понять, как бы я это использовал.

Пока:

 var newDataArr = [];
 for(var i = 0; i < this.state.data2.length; i++){
    var day = moment(this.state.data2[i].day,'YYY-MM-DD').format('ddd');
    console.log(day);
    if(newDataArr).contains(day) {
       // combine?
    } else { 
       // add new day of week
    }
 }

Мой желаемый результат будет примерно таким:

  newData2: [
    {
        day: "Sun",
        sales: [{hour: 6, value: 99}, {hour: 9, value: 164}, {hour: 17, value: 398}]
    },
    {
        day: "Mon",
        sales: [{hour: 3, value: 223}, {hour: 4, value: 12}]
    },
    {
        day: "Tue",
        sales: [{hour: 7, value: 323}, {hour: 3, value: 86}]
    },
    {
        day: "Wed",
        sales: [{hour: 5, value: 173}, {hour: 21, value: 65}]
    },
    {
      day: "Thu",
      sales: [{hour: 12, value: 193}, {hour: 1, value: 53}]
    },
    {
      day: "Fri",
      sales: [{hour: 15, value: 263}, {hour: 2, value: 56}]
    },
    {
      day: "Sat",
      sales: [{hour: 18, value: 89}, {hour: 8, value: 378}]
    }
  ]

1 Ответ

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

Достигнут результат в 2 формах.Я предпочитаю 2-й формы (без использования массива).

var data = [
    {
        day: "2018-01-01",
        sales: [{hour: 6, value: 23}, {hour: 9, value: 164}]
    },
    {
        day: "2018-01-02",
        sales: [{hour: 3, value: 223}, {hour: 4, value: 12}]
    },
    {
        day: "2018-01-03",
        sales: [{hour: 7, value: 323}, {hour: 3, value: 86}]
    },
    {
        day: "2018-01-04",
        sales: [{hour: 5, value: 173}, {hour: 21, value: 65}]
    },
    {
      day: "2018-01-05",
      sales: [{hour: 12, value: 193}, {hour: 1, value: 53}]
    },
    {
      day: "2018-01-06",
      sales: [{hour: 15, value: 263}, {hour: 2, value: 56}]
    },
    {
      day: "2018-01-07",
      sales: [{hour: 18, value: 89}, {hour: 8, value: 378}]
    },
    {
      day: "2018-01-08",
      sales: [{hour: 6, value: 76}, {hour: 17, value: 398}]
    }
  ];

console.log("Using Method 1 : ");
var result = [];

data.forEach(function(dataobj){
    var day = moment(dataobj.day).format("ddd");
    var detailsindex = result.findIndex(function(elem){ return elem.day==day;});
    var details = detailsindex>-1 ? result[detailsindex] : {day:day,sales:[]};
    dataobj.sales.forEach(function(salesobj){
        var index = details.sales.findIndex(function(elem){return elem.hour==salesobj.hour});
        var obj = index>-1 ? details.sales[index] : {hour:salesobj.hour,value:0};
        obj.value+=salesobj.value;
        if(index>-1) details.sales[index]=obj;
        else details.sales.push(obj)
    });
    if(detailsindex>-1) result[detailsindex]=details;
    else result.push(details)
});

console.log(result);
<script src="https://momentjs.com/downloads/moment.js"></script>

var data = [
    {
        day: "2018-01-01",
        sales: [{hour: 6, value: 23}, {hour: 9, value: 164}]
    },
    {
        day: "2018-01-02",
        sales: [{hour: 3, value: 223}, {hour: 4, value: 12}]
    },
    {
        day: "2018-01-03",
        sales: [{hour: 7, value: 323}, {hour: 3, value: 86}]
    },
    {
        day: "2018-01-04",
        sales: [{hour: 5, value: 173}, {hour: 21, value: 65}]
    },
    {
      day: "2018-01-05",
      sales: [{hour: 12, value: 193}, {hour: 1, value: 53}]
    },
    {
      day: "2018-01-06",
      sales: [{hour: 15, value: 263}, {hour: 2, value: 56}]
    },
    {
      day: "2018-01-07",
      sales: [{hour: 18, value: 89}, {hour: 8, value: 378}]
    },
    {
      day: "2018-01-08",
      sales: [{hour: 6, value: 76}, {hour: 17, value: 398}]
    }
  ];

console.log("Using Method 2 : ");
var result = {};

data.forEach(function(dataobj){
    var day = moment(dataobj.day).format("ddd");
    result[day] = result[day] || {};
    var details = result[day];
    dataobj.sales.forEach(function(salesobj){
        var count = details[salesobj.hour] || 0;
        details[salesobj.hour]=count+salesobj.value;
    });
});

console.log(result);
<script src="https://momentjs.com/downloads/moment.js"></script>
...