уменьшение или реформирование результата объекта запроса MySQL, Javascript - PullRequest
0 голосов
/ 09 июня 2018

у меня есть следующий объект, возвращенный из запроса mysql, который запрашивает таблицу cat с левым соединением таблицы pl:

[
  {catname: 'asdf', catid: 15, plname: 'pl1', plid: 20},
  {catname: 'asdf', catid: 15, plname: 'pl2', plid: 21},
  {catname: 'zxcv', catid: 16, plname: 'pl3', plid: 22},
  {catname: 'zxcv', catid: 16, plname: 'pl4', plid: 23}
]

объект, который мне нужен, выглядит следующим образом:

[
  {catname: 'asdf', catid: 15, pls: [{plname: 'pl1', plid: 20}, {plname: 'pl2', plid: 21}]},
  {catname: 'zxcv', catid: 15, pls: [{plname: 'pl3', plid: 22}, {plname: 'pl4', plid: 23}]}
]

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

1 Ответ

0 голосов
/ 09 июня 2018

Вы можете уменьшить свой массив до объекта (сгруппировать по уникальным идентификаторам), а затем превратить его в массив (Object.values):

const catpls = [
  {catname: 'asdf', catid: 15, plname: 'pl1', plid: 20},
  {catname: 'asdf', catid: 15, plname: 'pl2', plid: 21},
  {catname: 'zxcv', catid: 16, plname: 'pl3', plid: 22},
  {catname: 'zxcv', catid: 16, plname: 'pl4', plid: 23}
];

let cats = Object.values(
    catpls.reduce( (cats, {catname, catid, plname, plid}) => {
        if (! (catid in cats) )
            cats[catid] = {catname, catid, pls: []};
        cats[catid].pls.push({plname, plid});
        return cats;
    }, {})
);
...