Write code that enhances all arrays such that you can call the array.groupBy(fn) method on any array and it will return a grouped version of the array.
A grouped array is an object where each key is the output of fn(arr[i]) and each value is an array containing all items in the original array with that key.
The provided callback fn will accept an item in the array and return a string key.
The order of each value list should be the order the items appear in the array. Any order of keys is acceptable.
Please solve it without lodash's _.groupBy function.
Array.prototype.groupBy = function(fn) {
};
Example 1:
Input:
array = [
{"id":"1"},
{"id":"1"},
{"id":"2"}
],
fn = function (item) {
return item.id;
}
Output:
{
"1": [{"id": "1"}, {"id": "1"}],
"2": [{"id": "2"}]
}
Example 2:
Input:
array = [
[1, 2, 3],
[1, 3, 5],
[1, 5, 9]
]
fn = function (list) {
return String(list[0]);
}
Output:
{
"1": [[1, 2, 3], [1, 3, 5], [1, 5, 9]]
}
Example 3:
Input:
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
fn = function (n) {
return String(n > 5);
}
Output:
{
"true": [6, 7, 8, 9, 10],
"false": [1, 2, 3, 4, 5]
}
自解
Array.prototype.groupBy = function(fn) {
const group = {}
this.forEach(item => {
const key = fn(item);
if (group[key] === undefined) {
(group[key] = [item]);
} else {
group[key].push(item);
};
});
return group;
};
網友解
Array.prototype.groupBy = function(fn) {
// Reduce the array into a single object
return this.reduce((grouped, item) => {
// Apply the provided callback function to get the key
const key = fn(item);
// If the key doesn't exist in the grouped object, create a new array for it
if (!grouped[key]) {
grouped[key] = [];
}
// Push the current item to the array associated with the key
grouped[key].push(item);
// Return the updated grouped object for the next iteration
return grouped;
}, {});
};