Как группировать данные JSON Array по нескольким ключам - PullRequest
0 голосов
/ 27 апреля 2018

Как можно сгруппировать массив JSON по нескольким ключам в Nodejs.

Есть ли какое-нибудь решение с подчеркиванием или lodash (не имеет значения, является ли это простым javascript)?

Массив:

[{ key: '2017-1', y: 1, gkey: 'y' },
{ key: '2017-1', x: 1, gkey: 'x' }]

Ожидаемый результат:

[{ key: '2017-1', x: 1, y:1 }]

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы можете использовать reduce и Object.values

let arr = [ 
   { key: '2017-1', y: 1, gkey: 'y' },
   { key: '2017-1', x: 1, gkey: 'x' },
   { key: '2017-2', x: 1, gkey: 'x' },
];

let result = Object.values(arr.reduce((c, {key,gkey,...r}) => {
  c[key] = c[key] || {key};
  c[key] = Object.assign(c[key], r);
  return c;
}, {}));

console.log(result);

Если вы не можете использовать Object.values в вашей версии nodejs, вы можете:

let arr = [ 
   { key: '2017-1', y: 1, gkey: 'y' },
   { key: '2017-1', x: 1, gkey: 'x' },
   { key: '2017-2', x: 1, gkey: 'x' },
];

let temp = arr.reduce((c, {key,gkey,...r}) => {
  c[key] = c[key] || {key};
  c[key] = Object.assign(c[key], r);
  return c;
}, {});

let result = [];
for (let key in temp) result.push(temp[key]);

console.log(result);
0 голосов
/ 27 апреля 2018

если я правильно понял, что вам нужно, функция reduce может сделать то, что вам нужно.

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

Я не тестировал этот код, но он должен работать

arrayOfData.reduce((arr, elem) => {
    let e = arr.find(el => el.key === elem.key);
    if(!e) {
        e = {key : elem.key}
        arr.push(e);
    }
    e[elem.gkey] = elem[elem.gkey];
    return arr;
}, [])
...