У меня есть массив объектов, которые мне нужно отфильтровать и вернуть только самые близкие к сегодняшнему дню объекты. Проблема, с которой я сталкиваюсь, заключается в том, что она возвращает дату в июне, а не в мае. вот код, который я использую:
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));
Комментариев нет:
Отправить комментарий