Выполните вложенную группировку, используя loda sh на основе отметки времени момента - PullRequest
1 голос
/ 15 марта 2020

В настоящее время у меня есть следующий интерфейс:

export interface IFoo {
    id: any;
    notes?: string;
    timestamp: any;
}

API, с которым я сейчас работаю, возвращает массив этого интерфейса, например:

[{
    "id": 47,
    "notes": "asdas",
    "timestamp": "03/15/2020 08:47:42"
}, {
    "id": 48,
    "notes": "asdasd",
    "timestamp": "03/15/2020 15:16:12"
}]

Насколько это возможно для преобразования выше в структуру ниже? Зная, что я использую Observable для загрузки данных, поэтому мне потребуется использовать rx js:

this.foo$ = this.fooService.load
        .pipe(...

По существу, после использования map или любых других возможных операторов ответ должен быть разделен, как показано ниже : (Год, месяц, день)

[
    {
        year: YYYY,
        count: 0, // <- total `foos` in year
        months: [
            {
                month: 'January',
                count: 0, // <- total `foos` in month
                days: [
                    {
                        day: 0,
                        count: 0, // <- total `foos` in day
                        foos: [
                            {
                                Id: 0,
                                Notes: '...',
                                Timestamp: '...'
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

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

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

Заранее спасибо.

1 Ответ

1 голос
/ 15 марта 2020

В простом Javascript без момент и loda sh, вы можете взять массив для вложенных групп с ключом

  • ,
  • обратный вызов для получения ключа,
  • children, для следующего вложенного уровня.

Затем итерируйте данные и массив групп и добавьте для каждого уровня один для подсчета и в конце pu sh объекта до foos.

var data = [{ id: 47, notes: "asdas", timestamp: "2020-03-15 08:47:42" }, { id: 48, notes: "asdasd", timestamp: "2020-03-15 15:16:12" }],
    groups = [
        ['year', ({ timestamp }) => timestamp.slice(0, 4), 'month'],
        ['month', ({ timestamp }) => timestamp.slice(5, 7), 'days'],
        ['days', ({ timestamp }) => timestamp.slice(8, 10), 'foos']
    ],
    result = data.reduce((r, o) => {
        groups
            .reduce((parent, [key, fn, children]) => {
                var group = parent.find(q => q[key] === fn(o));
                if (!group) parent.push(group = { [key]: fn(o), count: 0, [children]: [] });
                group.count++;
                return group[children];
            }, r)
            .push(o);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...