Being a C# developer I really like and use Linq a lot. It can simplify code a great deal. So it is only natural to want the same goodness in javascript. Luckily there is a framework - linq.js - that provides this functionality. However, the syntax is not quite the same, so it takes a little getting used to.
In this post I want to show an example of how to do a group by.
I have a bunch of people in a collection, each person defined by name, age and job. Now I want to group these people by job. The result should be a grouped collection, where each group contains the person objects belonging to a specific job.
In C# it looks something like this:
var people = new[] { new { Name = "Carl", Age = 33, Job = "Tech" }, new { Name = "Homer", Age = 42, Job = "Tech" }, new { Name = "Phipps", Age = 35, Job = "Nurse" }, new { Name = "Doris", Age = 27, Job = "Nurse" }, new { Name = "Willy", Age = 31, Job = "Janitor" } }; var grouped = people.GroupBy( person => person.Job, (job, persons) => new { Job = job, Persons = persons }); foreach (var group in grouped) { System.Diagnostics.Debug.WriteLine("job: " + group.Job); foreach (var person in group.Persons) { System.Diagnostics.Debug.WriteLine(" name: {0}, age: {1}, job: {2}", person.Name, person.Age, person.Job); } }
The group by statement is fairly simple, and the output is exactly as expected:
job: Tech
name: Carl, age: 33, job: Tech
name: Homer, age: 42, job: Tech
job: Nurse
name: Phipps, age: 35, job: Nurse
name: Doris, age: 27, job: Nurse
job: Janitor
name: Willy, age: 31, job: Janitor
The same thing in linq.js is a little bit more involved, and for me it did take some playing around before I ended up with the code below. But basically it is quite similar to the C# version.
var people = [ { name: "Carl", age : 33, job: "Tech" }, { name: "Homer", age : 42, job: "Tech" }, { name: "Phipps", age : 35, job: "Nurse" }, { name: "Doris", age: 27, job: "Nurse" }, { name: "Willy", age: 31, job: "Janitor" } ]; var grouped = Enumerable .From(people) .GroupBy( function (person) { return person.job; }, // Key selector function (person) { return person; }, // Element selector function (job, grouping) { // Result selector return { job: job, persons: grouping.source }; }) .ToArray(); alert(JSON.stringify(grouped));
And the result:
[{ "job": "Tech", "persons": [{ "name": "Carl", "age": 33, "job": "Tech" }, { "name": "Homer", "age": 42, "job": "Tech" }] }, { "job": "Nurse", "persons": [{ "name": "Phipps", "age": 35, "job": "Nurse" }, { "name": "Doris", "age": 27, "job": "Nurse" }] }, { "job": "Janitor", "persons": [{ "name": "Willy", "age": 31, "job": "Janitor" }] }]