Overview
Grouping data refers to the process of taking an array of objects, and then splitting that array into multiple groups, where the items of a group share some property.
As an example, consider the following records.
These records may represent the incomes of employees in a company and each employees age. You may wish to view the distribution of incomes by age, which means you want to group all the records according to age.
The $group api provides a method to group the records by a given column.
let data = [{age:40, income:100000},{age:30, income:40000},{age:40, income:56000},{age:32, income:100000},{age:35, income:100000}, ];
let groups = $group(data, p=>p.age);
Try it
The groups varialbe will now hold a dictionary where the keys are the values of the ages in the original array. The values associated with each key is an array of the items that have that age. Then, to retrieve an array of items with an age of 40, you could execute the following call.
let forty = groups(40);
To return the groupings as an object or map, one can simply call the gropus function with no arguments.
let map = groups();
Using Computed Group Criteria
Groupings dont necessarily have to use a specific property of the items being grouped. For example, you could group by a computed value. For example, the following groups the set of price data by month. This code uses the split method of the string object to split the date into 3 fields, and then returns the second field (which is the month). (That is, the data is grouped by month)
let data = [{date:'2000-01-01', price:100},{date:'2000-01-10', price:100},{date:'2000-01-31', price:100},{date:'2000-02-01', price:100},{date:'2000-02-10', price:100}, ];
let groups = $group(data, p=>p.date.split('-')[1]);
Try it
Groups as a List
When you do a grouping using the $list api, you get a Javascript dictionary out of it. However, you can transform this back to a list by using the toList method.
let data = [{age:40, income:100000},{age:30, income:40000},{age:40, income:56000},{age:32, income:100000},{age:35, income:100000}, ];
let groups = $list(data).group(p=>p.age).items;
Try it
This creates a list of records with two properties, a keys property and a values property. For example, the record with the age value of 40 would be given as follows.
{keys:[40], values:[{age:40, income:100000},{age:40, income:56000},]}
Notice that the keys value is an array, despite the fact that only one key was used in the grouping. This is to accommodate groupings that are based on multiple keys (see above).
Video Demos
Working with Sales Data