Как я могу оптимизировать фильтрацию массива по дате и времени? - PullRequest
2 голосов
/ 29 мая 2020

Я написал этот простой массив фильтров для каждого времени данных, но не уверен, что это хороший способ.

Пример данных:

[
  {
    "content": "test1",
    "createdAt": "2020-05-29T13:46:14.000Z"
  },
  {
    "content": "test2",
    "createdAt": "2020-05-29T13:46:14.000Z"
  },
  {
    "content": "test3",
    "createdAt": "2020-05-27T13:46:14.000Z"
  }
]

И я хочу преобразовать его следующим образом:

 {
      "Fri May 29 2020": [
        {
          "content": "test1",
          "createdAt": "2020-05-29T13:46:14.000Z"
        },
        {
          "content": "test2",
          "createdAt": "2020-05-29T13:46:14.000Z"
        }
      ],
      "Wed May 27 2020": [
        {
          "content": "test3",
          "createdAt": "2020-05-27T13:46:14.000Z"
        }
      ]
    }

И вот мой код:

let usedDates = new Set();
let logs = {};

for(let log of data) {
    const date = new Date(log.createdAt).toDateString();
    if(usedDates.has(date)) continue;

    logs[date] = data.filter((e) => date == new Date(e.createdAt).toDateString());
    usedDates.add(date);
}

да, он работает, но не уверен, что это хорошо.

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Этот простой reduce трюк может вам помочь

const data = [
  {
    "content": "test1",
    "createdAt": "2020-05-29T13:46:14.000Z"
  },
  {
    "content": "test2",
    "createdAt": "2020-05-29T13:46:14.000Z"
  },
  {
    "content": "test3",
    "createdAt": "2020-05-27T13:46:14.000Z"
  }
]

const result = data.reduce((acc, value) => {
  const date = new Date(value.createdAt);
  const dateFormatted = date.toDateString();
  
  acc[dateFormatted] = [...(acc[dateFormatted] || []), value];
  
  return acc;

}, {})

console.log(result);
2 голосов
/ 29 мая 2020

Для больших массивов это не очень хорошая производительность: вы идете по массиву данных (для l oop) и для каждого шага вызываете фильтр для полных данных. Стоимость вырастает до квадрата.

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