Created
October 25, 2018 23:18
-
-
Save robmathers/1830ce09695f759bf2c4df15c29dd22d to your computer and use it in GitHub Desktop.
A more readable and annotated version of the Javascript groupBy from Ceasar Bautista (https://stackoverflow.com/a/34890276/1376063)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var groupBy = function(data, key) { // `data` is an array of objects, `key` is the key (or property accessor) to group by | |
// reduce runs this anonymous function on each element of `data` (the `item` parameter, | |
// returning the `storage` parameter at the end | |
return data.reduce(function(storage, item) { | |
// get the first instance of the key by which we're grouping | |
var group = item[key]; | |
// set `storage` for this instance of group to the outer scope (if not empty) or initialize it | |
storage[group] = storage[group] || []; | |
// add this item to its group within `storage` | |
storage[group].push(item); | |
// return the updated storage to the reduce function, which will then loop through the next | |
return storage; | |
}, {}); // {} is the initial value of the storage | |
}; |
Thanks!
A simple version with a supplier for the groups
const groupBy = (arr, keysSupplier) => {
return arr.reduce((obj, elt) => {
let key = keysSupplier(elt)
if (obj[key] === undefined)
obj[key] = []
obj[key].push(elt)
return obj
}, {})
}
// Example
// Grouping array by typeof
groupBy(array, elt => typeof elt)
i looking for these outputs
[
{
custom: 'data1 custom b',
group_by: 'school x',
"children": {
// data
}
},
{
custom: 'data2 custom a',
group_by: 'school a',
"children": {
// data
}
},
]
but the unexpected is
'school a': {
// data
},
'school x': {
// data
}
i have tried with
storage['data'] = storage['data'] || [];
storage[group] = storage[group] || [];
// add this item to its group within `storage`
storage[group].push(item);
// storage['data'].push({
// label: group,
// mode: 'span',
// html: false,
// children: storage[group]
// });
but its looping the result.
i have solved by add new function look like these
exports.groupByVue = async function(data) {
let result = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const element = data[key];
result.push({
label: key,
children: element,
})
}
}
return result;
}
but i want the code is inside the group by as default .
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
thank you all for these great solutions. Really helped me 😄