javascript срезает массив объектов по дате

#javascript #node.js #arrays #slice

Вопрос:

У меня есть эти данные

 [{value: 29.3, type: 'temperature', unit: 'C', time: '2021-10-03T16:00:00.000Z'},
{value: 14, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
{value: -4.1, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
{value: 29.4, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
{value: 6.1, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
{value: 24.5, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
{value: 8.3, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
{value: 20, type: 'temperature', unit: 'C', time: '2021-12-03T19:00:00.000Z'},
{value: 20.6, type: 'temperature', unit: 'C', time: '2021-12-03T19:00:00.000Z'},
{value: 19.5, type: 'temperature', unit: 'C', time: '2021-12-03T20:00:00.000Z'}]
 

время-это просто строка, поэтому я добавляю дату к каждому объекту, чтобы использовать метод .getDay() с даты.

 const temperatureData =
                data.filter(d => d.type === 'temperature')
                    .map(d => {
                        d.date = new Date(d.time)
                        return d
                    })
 

Я хочу, чтобы он был нарезан по датам.

     [
      [
        {
            "value": 29.3,
            "type": "temperature",
            "unit": "C",
            "time": "2021-10-03T16:00:00.000Z"
        },
        {
            "value": 14,
            "type": "temperature",
            "unit": "C",
            "time": "2021-10-03T17:00:00.000Z"
        },
        {
            "value": -4.1,
            "type": "temperature",
            "unit": "C",
            "time": "2021-10-03T17:00:00.000Z"
        },
        {
            "value": 29.4,
            "type": "temperature",
            "unit": "C",
            "time": "2021-10-03T17:00:00.000Z"
        }
      ],
      [
        {
            "value": 6.1,
            "type": "temperature",
            "unit": "C",
            "time": "2021-11-03T18:00:00.000Z"
        },
        {
            "value": 24.5,
            "type": "temperature",
            "unit": "C",
            "time": "2021-11-03T18:00:00.000Z"
        },
        {
            "value": 8.3,
            "type": "temperature",
            "unit": "C",
            "time": "2021-11-03T18:00:00.000Z"
        }
      ],
      [
        {
            "value": 20,
            "type": "temperature",
            "unit": "C",
            "time": "2021-12-03T19:00:00.000Z"
        },
        {
            "value": 20.6,
            "type": "temperature",
            "unit": "C",
            "time": "2021-12-03T19:00:00.000Z"
        },
        {
            "value": 19.5,
            "type": "temperature",
            "unit": "C",
            "time": "2021-12-03T20:00:00.000Z"
        }
      ]
    ]

 

Комментарии:

1. что вы подразумеваете под нарезкой по датам? Не могли бы вы предоставить образец вывода с объяснением?

Ответ №1:

Вы могли бы использовать reduce для этого и на каждой итерации проверять, не изменилась ли часть даты. Если это так, добавьте новый подмассив в накопитель:

 let data =[
    {value: 29.3, type: 'temperature', unit: 'C', time: '2021-10-03T16:00:00.000Z'},
    {value: 14, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
    {value: -4.1, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
    {value: 29.4, type: 'temperature', unit: 'C', time: '2021-10-03T17:00:00.000Z'},
    {value: 6.1, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
    {value: 24.5, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
    {value: 8.3, type: 'temperature', unit: 'C', time: '2021-11-03T18:00:00.000Z'},
    {value: 20, type: 'temperature', unit: 'C', time: '2021-12-03T19:00:00.000Z'},
    {value: 20.6, type: 'temperature', unit: 'C', time: '2021-12-03T19:00:00.000Z'},
    {value: 19.5, type: 'temperature', unit: 'C', time: '2021-12-03T20:00:00.000Z'}
];

let result = data.reduce((acc, item, i) => {
    if (i amp;amp; item.time.replace(/T.*/, "") === data[i-1].time.replace(/T.*/, "")) {
        acc[acc.length-1].push(item);
    } else {
        acc.push([item]);
    }
    return acc;
}, []);

console.log(result);