GOOGLE ADS

четверг, 12 мая 2022 г.

Как отфильтровать массив объектов по дате

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

const findClosest = (data, accessor, target = Date.now()) =>
data.reduce((prev, curr) => {
const a = Math.abs(accessor(curr).getTime() - target);
const b = Math.abs(accessor(prev).getTime() - target);
return a - b < 0? curr: prev;
});
const getClosestFromDate = (array, key, date) => {
let arr = array.filter((e) => e[key] == date);
return arr;
};
const sampleData = [{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"is_swappable": true,
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-07-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"next_charge_scheduled_at": "2022-07-23T00:00:00",
"order_day_of_month": null,
},
];
const processDateString = (dateString) => {
let date = new Date(dateString);
let year = date.getFullYear();
let month = date.getMonth();
console.log(date.toString());
return new Date(year, month + 1, date);
};
const closest = findClosest(sampleData, ({
next_charge_scheduled_at
}) => processDateString(next_charge_scheduled_at), "2022-05-10T03:03:42");
console.log(closest.next_charge_scheduled_at);
console.log(getClosestFromDate(sampleData, "next_charge_scheduled_at", closest.next_charge_scheduled_at));

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


Решение проблемы

Вы слишком усложнили себе жизнь:

(Я пересмотрел свой ответ после прочтения последнего комментария ОП.)

Const acc— это утилита function(obj), которая захватывает next_charge_scheduled_atсвойство obj, превращает его в dateобъект и затем возвращает его .getTime()значение.

findClosest(sampleData,acc)возвращает единственный объект данного sampleDataмассива, ближайший к целевому времени ( Date.now()). Затем я сохраняю .getTime()значение этого элемента в константе closestи снова использую его для фильтрации исходного входного массива:


const sampleData = [{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"is_swappable": true,
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-06-23T00:00:00",
},
{
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-07-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"max_retries_reached": 0,
"next_charge_scheduled_at": "2022-05-23T00:00:00",
"order_day_of_month": null,
},
{
"next_charge_scheduled_at": "2022-07-23T00:00:00",
"order_day_of_month": null,
},
];
const
findClosest = (data, accessor, target = Date.now()) =>
data.reduce((prev, curr) => {
const a = Math.abs(accessor(curr) - target);
const b = Math.abs(accessor(prev) - target);
return a - b < 0? curr: prev;
}),
acc=obj=>new Date(obj.next_charge_scheduled_at).getTime(),
closest=acc(findClosest(sampleData,acc));

console.log(sampleData.filter(d=>acc(d)===closest));

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...