
- Javascript Basics Tutorial
- Javascript - Home
- Javascript - Overview
- Javascript - Syntax
- Javascript - Enabling
- Javascript - Placement
- Javascript - Variables
- Javascript - Operators
- Javascript - If...Else
- Javascript - Switch Case
- Javascript - While Loop
- Javascript - For Loop
- Javascript - For...in
- Javascript - Loop Control
- Javascript - Functions
- Javascript - Events
- Javascript - Cookies
- Javascript - Page Redirect
- Javascript - Dialog Boxes
- Javascript - Void Keyword
- Javascript - Page Printing
- JavaScript Objects
- Javascript - Objects
- Javascript - Number
- Javascript - Boolean
- Javascript - Strings
- Javascript - Arrays
- Javascript - Date
- Javascript - Math
- Javascript - RegExp
- Javascript - HTML DOM
- JavaScript Advanced
- Javascript - Error Handling
- Javascript - Validations
- Javascript - Animation
- Javascript - Multimedia
- Javascript - Debugging
- Javascript - Image Map
- Javascript - Browsers
- JavaScript Useful Resources
- Javascript - Questions And Answers
- Javascript - Quick Guide
- Javascript - Functions
- Javascript - Resources
Most efficient method to groupby on an array of objects - JavaScript
Suppose, we have an array of objects like this −
const arr = [ { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" }, { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" } ];
We are required to write a JavaScript function that takes in one such array as the first argument.
Our purpose is to be able to group the given array based on multiple or one single property (indicated by second, third arguments.)
Therefore, if we did groupby Phase, we should receive −
const output = [ { Phase: "Phase 1", Value: 50 }, { Phase: "Phase 2", Value: 130 } ];
And if we did groupy Phase / Step, we should receive −
const output = [ { Phase: "Phase 1", Step: "Step 1", Value: 15 }, { Phase: "Phase 1", Step: "Step 2", Value: 35 }, { Phase: "Phase 2", Step: "Step 1", Value: 55 }, { Phase: "Phase 2", Step: "Step 2", Value: 75 } ];
Example
The code for this will be −
const arr = [ { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" }, { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" } ]; const groupBy = (array, groups, valueKey) => { const map = new Map; groups = [].concat(groups); return array.reduce((acc, val) => { groups.reduce((accu, value, ind, { length }) => { let child; if (accu.has(val[value])) { return accu.get(val[value]); }; if (ind + 1 === length) { child = Object .assign(...groups.map(value => ({ [value]: val[value] })), { [valueKey]: 0 }); acc.push(child); } else { child = new Map; }; accu.set(val[value], child); return child; }, map)[valueKey] += +val[valueKey]; return acc; }, []); }; console.log(groupBy(arr, 'Phase', 'Value')); console.log(groupBy(arr, ['Phase', 'Step'], 'Value'));
Output
And the output in the console will be −
[ { Phase: 'Phase 1', Value: 50 }, { Phase: 'Phase 2', Value: 130 } ] [ { Phase: 'Phase 1', Step: 'Step 1', Value: 15 }, { Phase: 'Phase 1', Step: 'Step 2', Value: 35 }, { Phase: 'Phase 2', Step: 'Step 1', Value: 55 }, { Phase: 'Phase 2', Step: 'Step 2', Value: 75 } ]
- Related Articles
- Most efficient method to groupby on an array of objects in Javascript
- Creating an array of objects based on another array of objects JavaScript
- Filter an array containing objects based on another array containing objects in JavaScript
- Converting array of objects to an object of objects in JavaScript
- What is the most efficient way to deep clone an object in JavaScript?
- Sorting an array of objects by an array JavaScript
- Using methods of array on array of JavaScript objects?
- Search from an array of objects via array of string to get array of objects in JavaScript
- Can we share a method between JavaScript objects in an array?
- How to sort an array of objects based on the length of a nested array in JavaScript
- Converting array of objects to an object in JavaScript
- What is the most efficient string concatenation method in python?
- GroupBy() Method in C#
- What's the most efficient way to turn all the keys of an object to lower case - JavaScript?
- How to access properties of an array of objects in JavaScript?

Advertisements