Как я могу сгруппировать и посчитать предметы на объекте в машинописи? - PullRequest
0 голосов
/ 07 июля 2019

У меня есть объект с такой структурой:

[{category:'A',sub:'A-1'},
 {category:'B',sub:'A-1'},
 {category:'A',sub:'B-1'},
 {category:'A',sub:'A-1'}];

и я хочу сгруппировать по категориям и посчитать повторения свойства 'sub', чтобы получить что-то вроде этого:

[
    {category:'A',data:[{sub:'A-1',count:2},{sub:'B-1',count:1}]},
    {category:'B',data:[{sub:'A-1',count:1}]}
]

Я думаю, что почти там, но я не могу понять, как сделать это правильно. Вот мой код:

let myData:any[]=[{category:'A',sub:'A-1'},{category:'B',sub:'A-1'},{category:'A',sub:'B-1'},{category:'A',sub:'A-1'}];

let categories= Array.from(new Set(myData.map(x => x.category)));

let statistics=categories.map(x=>{
  let j={category:x,data:[]};
  j.data.push( myData.filter(a=>a.category==x)
  .reduce((a, c) => (a[c.sub] = (a[c.sub] || 0) + 1, a), Object.create(null)));

  return j;
})
console.log(JSON.stringify( statistics));

Но вывод генерируется именно так:

[
 {"category":"A","data":[{"A-1":2,"B-1":1}]},
 {"category":"B","data":[{"A-1":1}]}
]

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Я обновил свой код с помощью подсказки @ zerkms №1. Итерация по {"A-1":2,"B-1":1} с Object.entries. Вот код:

let myData:any[]=[{category:'A',sub:'A-1'},{category:'B',sub:'A-1'},{category:'A',sub:'B-1'},{category:'A',sub:'A-1'}];

let categories= Array.from(new Set(myData.map(x => x.category)));

let statistics=categories.map(x=>{
  let categoryItem={category:x,data:[]};

  let subItem= myData.filter(my=>my.category==x)
  .reduce((a, c) => (a[c.sub] = (a[c.sub] || 0) + 1, a), Object.create(null));

   for (const [key, value] of Object.entries(subItem)) {
     categoryItem.data.push({'sub':key,'count':value})
  }
  return categoryItem;

})

console.log(JSON.stringify( statistics));
0 голосов
/ 07 июля 2019

Я немного обновил ваш код, и теперь он воспроизводит вывод желаемого, посмотрите.Я чувствую, мы можем оптимизировать этот код дальше.

let myData = [{ category: 'A', sub: 'A-1' },
    { category: 'B', sub: 'A-1' }, { category: 'A', sub: 'B-1' }, { category: 'A', sub: 'A-1' }];
let x;
let categories = Array.from(new Set(myData.map(x => x.category)));
let distinctSubs = [];
let counterObj = { sub: '', count: 0 };
let counterObjArr = [];
let statistics = categories.map(x => {
    distinctSubs = Array.from(new Set(myData.filter(p => p.category === x).map(y => y.sub)));
    counterObjArr.length = 0;
    let j = { category: x, data: Object.assign([], counterObjArr) };
    distinctSubs.forEach(s => {
        j.data.push({ sub: s, count: myData.filter(z => z.category === x && z.sub === s).length });
    });
    return j;
});
console.log(JSON.stringify(statistics));
...