I have an array of lines:
this.lines = [
0: {indexLine: 0, group: 16, columns: [,…]}
1: {indexLine: 1, group: 16,…}
2: {indexLine: 2, group: 16,…}
3: {indexLine: 3, group: 9,…}
]
I want to group lines by group to be able render it in different tables.
I have tried this:
let arr: any = {};
this.lines.forEach((line) => {
if (!arr[line.group]) {
arr[line.group] = [];
}
arr[line.group].push(line);
});
CodePudding user response:
You can use Set
to get unique group
values from array of object. new Set(lines.map(x => x.group)
will give you array of unique values of group.
Convert that set to array with Array.from()
.
Now you can use map to iterate through unique group values and Array.filter
would give you all matching elements.
let lines = [
{indexLine: 0, group: 16},
{indexLine: 1, group: 16},
{indexLine: 2, group: 16},
{indexLine: 3, group: 9},
];
const groupedLines = Array.from(new Set(lines.map(x=>x.group))).map(y => lines.filter(z => z.group === y));
console.log(groupedLines);
CodePudding user response:
You could use the reduce method to get what you want:
const result = this.lines.reduce((acc, item) => {
if (!acc[item.group]) {
acc[item.group] = [];
}
acc[item.group].push(item);
return acc;
}, {});
If you want to get all the groups as multiple arrays instead of an object, you can use Object.values
to do just that:
const groups = Object.values(result);
CodePudding user response:
you can use lodash.groupBy
yarn add lodash.groupby
( or npm install lodash.groupby --save
)
import groupBy from 'lodash.groupby'; // 12.6k (gzipped 4.8k)
// ...
console.log(groupBy(this.lines, ({group}) => group)));
( self-explanatory code there, 0 WTFs per minute )