Группировка массива с объектами по заданному селекту JS

Рейтинг: 1Ответов: 1Опубликовано: 13.01.2023

Имеется массив с объектами, который приходит с бэка:

const arr = [{time: "2022-11-25T10:51:26.390Z", и другие поля}, {time: "2022-12-25T10:51:26.390Z"}, {time: "2022-10-25T10:51:26.390Z"}, и так до бесконечности...]

На фронте нужно реализовать сортировку по селекту в котором есть поля: "За всё время", "За месяц", "За неделю". Если выбрали такой-то селект, то сгруппируй массив и верни и отобрази на странице эти элементы.

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

Ответы

▲ 0

Предложу такой вариант...

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
}