Группировка массива с объектами по заданному селекту JS
Имеется массив с объектами, который приходит с бэка:
const arr = [{time: "2022-11-25T10:51:26.390Z", и другие поля}, {time: "2022-12-25T10:51:26.390Z"}, {time: "2022-10-25T10:51:26.390Z"}, и так до бесконечности...]
На фронте нужно реализовать сортировку по селекту в котором есть поля: "За всё время", "За месяц", "За неделю". Если выбрали такой-то селект, то сгруппируй массив и верни и отобрази на странице эти элементы.
Если кто-то реализовал подобный функционал, поделитесь идеями, как без сильной нагрузки на приложение реализовать этот функционал, а то все мои варианты пока сводятся к огромным вычислениям...
Ответы (1 шт):
Автор решения: ksa
→ Ссылка
Предложу такой вариант...
const arr = [
{time: "2022-11-25T10:51:26.390Z"},
{time: "2022-12-25T10:51:26.390Z"},
{time: "2023-01-10T10:51:26.390Z"},
{time: "2022-10-25T10:51:26.390Z"}
]
const mn = month()
const wk = week()
const obj = arr.reduce((r, o) => {
r['За всё время'].push(o)
if (month(o.time) === mn) r['За месяц'].push(o)
if (segment(wk, o.time)) r['За неделю'].push(o)
return r
}, {'За всё время': [], 'За месяц': [], 'За неделю': []})
console.log(obj)
// Попадает ли дата в отрезок d1 - d2
function segment(wk, date = new Date()) {
if (typeof date === 'string') date = new Date(date)
if (date < wk[0]) return false
if (date > wk[1]) return false
return true
}
// Определить начало и конец недели
function week(date = new Date()) {
if (typeof date === 'string') date = new Date(date)
const n = date.getDay() || 7
const d = date.getDate()
let d1 = (new Date(date)).setDate(d + (1 - n))
let d2 = (new Date(date)).setDate(d + (7 - n))
d1 = new Date(d1)
d2 = new Date(d2)
return [d1, d2]
}
// Определить месяц
function month(date = new Date()) {
if (typeof date === 'string') date = new Date(date)
const val = date.toISOString().split('T')[0].match(/\d+\-\d+/)[0]
return val
}