Я работаю с массивом словарей и хочу сгруппировать данные по периоду времени, у меня есть решение, как это сделать.
Но теперь я обнаружил проблемы, за последние часы данные не отображаются в сгруппированном массиве.
Код:
// Dictionary array:
var array = [
{ item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 05:21:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:34:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 08:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:16:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 10:36:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:47:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 12:37:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:27:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:37:33" },
];
// And I have time periods, for ex:
var time = ["05:45 - 06:00", "06:00 - 07:00",
"07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00",
"10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00",
"13:00 - 14:00", "14:00 - 14:45"];
var formatedTime = time.map(function(val) {
return val.split(" - ");
});
var grouped = formatedTime.reduce((groups, currentValue, cI) => {
let min = parseInt(currentValue[0].substring(0,2));
let max = parseInt(currentValue[1].substring(0,2));
let filtered = array.filter(val => {
let validDate = val.dateTime.replace(///g,'-').replace(' ','T').replace('19','2019');
let date = new Date(validDate).getHours();
let result = false;
if (date >= min && date < max) {
return true;
} else {
return false;
}
});
let date = currentValue[0] + " - " + currentValue[1];
groups.push({
time: date,
groupedData: filtered
});
return groups;
}, []);
console.info(grouped);
Итак, как вы можете видеть в массиве, у меня есть данные для время 14:00 - 14:45 после фильтрации данных, которые отображаются неправильно.
В моем массиве у меня есть две записи:
{ item: "item", category: "category", dateTime: "19/05/23 14:27:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:37:33" },
Я пытаюсь найти решение, но я застрял.
Ожидаемый результат:
{
"time": "14:00 - 14:45",
"groupedData": [{ item: "item", category: "category", dateTime: "19/05/23 14:27:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:37:33" }]
}
@MaheerAli, у меня есть вопрос
Вы сравниваете только часы, но должны сравнивать и минуты.
Я думаю, вы задавали этот вопрос несколько дней назад. stackoverflow.com/questions/56269154/…
@MuraliNepalli нет
Вы можете напрямую сравнить время и найти сначала группу, а затем элемент в наборе результатов.
var array = [{ item: "item", category: "category", dateTime: "19/05/23 05:46:33" }, { item: "item", category: "category", dateTime: "19/05/23 05:21:33" }, { item: "item", category: "category", dateTime: "19/05/23 06:31:33" }, { item: "item", category: "category", dateTime: "19/05/23 06:46:33" }, { item: "item", category: "category", dateTime: "19/05/23 07:34:33" }, { item: "item", category: "category", dateTime: "19/05/23 07:55:33" }, { item: "item", category: "category", dateTime: "19/05/23 08:46:33" }, { item: "item", category: "category", dateTime: "19/05/23 09:16:33" }, { item: "item", category: "category", dateTime: "19/05/23 09:46:33" }, { item: "item", category: "category", dateTime: "19/05/23 10:36:33" }, { item: "item", category: "category", dateTime: "19/05/23 11:47:33" }, { item: "item", category: "category", dateTime: "19/05/23 11:55:33" }, { item: "item", category: "category", dateTime: "19/05/23 12:37:33" }, { item: "item", category: "category", dateTime: "19/05/23 14:27:33" }, { item: "item", category: "category", dateTime: "19/05/23 14:37:33" }],
time = ["05:45 - 06:00", "06:00 - 07:00", "07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00", "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00", "13:00 - 14:00", "14:00 - 14:45"],
result = array.reduce((r, o) => {
var part = o.dateTime.slice(9, 14),
group = time.find(t => {
var [min, max] = t.split(' - ');
return min <= part && part < max;
}),
temp = r.find(({ time }) => time === group);
if (!group) return r;
if (!temp) {
r.push({ time: group, groupedData: [o] });
return r;
}
temp.groupedData.push(o);
return r;
}, []);
console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
В вашем коде вы сравниваете только часы и игнорируете минуты. Это вызывает проблему с периодом 14:00 - 14:45
.
Из-за того, как даты отформатированы и как вы выполняете сравнение, вы можете просто обойтись здесь сравнением на основе строк:
const array = [
{ item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 05:21:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:34:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 08:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:16:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 10:36:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:47:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 12:37:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:27:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:37:33" },
];
const times = ["05:45 - 06:00", "06:00 - 07:00",
"07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00",
"10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00",
"13:00 - 14:00", "14:00 - 14:45"];
const grouped = times.map(time => {
const [min, max] = time.split(' - ');
const groupedData = array.filter(({dateTime}) => {
const ts = dateTime.substring(9, 14);
return ts >= min && ts < max;
});
return {time, groupedData};
});
console.info(grouped);
const array = [
{ item: "item", category: "category", dateTime: "19/05/23 05:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 05:21:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:31:33" },
{ item: "item", category: "category", dateTime: "19/05/23 06:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:34:33" },
{ item: "item", category: "category", dateTime: "19/05/23 07:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 08:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:16:33" },
{ item: "item", category: "category", dateTime: "19/05/23 09:46:33" },
{ item: "item", category: "category", dateTime: "19/05/23 10:36:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:47:33" },
{ item: "item", category: "category", dateTime: "19/05/23 11:55:33" },
{ item: "item", category: "category", dateTime: "19/05/23 12:37:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:27:33" },
{ item: "item", category: "category", dateTime: "19/05/23 14:37:33" },
];
// And I have time periods, for ex:
const times = ["05:45 - 06:00", "06:00 - 07:00",
"07:00 - 08:00", "08:00 - 09:00", "09:00 - 10:00",
"10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00",
"13:00 - 14:00", "14:00 - 14:45"
];
const result = [];
times.forEach((time) => {
const [min, max] = time.split(" - ");
const groupedData = array.filter(({ dateTime }) => {
return `${min}:00`.localeCompare(dateTime.slice(-8)) <= 0 && `${max}:00`.localeCompare(dateTime.slice(-8)) >= 0;
})
result.push({
time,
groupedData
});
});
console.info('@>result', result)
Каков ожидаемый результат?