I have a JavaScript task where I have to implement a function "groupBy", which, when given an array of objects and a function, returns an object where the input objects are keyed by the result of calling the fn on each of them.
Essentially, I have to write a function, "groupBy(array, callback)", returns an object where the following is returned.
For example:
  var list = [{id: "102", name: "Alice"},
              {id: "205", name: "Bob", title: "Dr."},
              {id: "592", name: "Clyde", age: 32}];
  groupBy(list, function(i) { return i.id; });
Returns:
  {
    "102": [{id: "102", name: "Alice"}],
    "205": [{id: "205", name: "Bob", title: "Dr."}],
    "592": [{id: "592", name: "Clyde", age: 32}]
  }
Example 2:
  groupBy(list, function(i) { return i.name.length; });
Returns:
  {
    "3": [{id: "205", name: "Bob", title: "Dr."}],
    "5": [{id: "102", name: "Alice"},
          {id: "592", name: "Clyde", age: 32}]
  }
I'm still quite new to callback functions, and would like some tips/advice to simply get started. Even links to good tutorials would be greatly appreciated.
It's a reduce() one-liner. Reduce allows you to loop through the array and append to a new object based on the logic of its callback. In this function a (for accumulated) is the object we're making and c (for current item) is each item in the loop taken one at a time.
It works especially concisely here because the function to make the object key is passed in:
var list = [{id: "102", name: "Alice"},
{id: "205", name: "Bob", title: "Dr."},
{id: "592", name: "Clyde", age: 32}];
function groupBy(list, Fn) {
    return list.reduce((a, c) => (a[Fn(c)] ? a[Fn(c)].push(c) : a[Fn(c)] = [c], a), {})
}
var t = groupBy(list, function(i) { return i.id; });
console.log(t)
var l = groupBy(list, function(i) { return i.name.length; });
console.log(l)
Solution with pure JS:
var list = [{
    id: "102",
    name: "Alice"
  },
  {
    id: "205",
    name: "Bob",
    title: "Dr."
  },
  {
    id: "592",
    name: "Clyde",
    age: 32
  }
];
function groupBy(array, callback) {
  return array.reduce(function(store, item) {
    var key = callback(item);
    var value = store[key] || [];
    store[key] = value.concat([item]);
    return store;
  }, {})
}
console.log('example 1: ', groupBy(list, function(i) { return i.id; }));
console.log('example 2: ', groupBy(list, function(i) { return i.name.length; }));
Heres a link to the code: http://rextester.com/KROB29161
function groupBy(list, callback) {
  // Declare a empty object
  var obj = {};
  // We then loop through the array
  list.forEach(function(item) {
    // We define the key of the object by calling the 
    // callback with the current item
    var key = callback(item);
    // If the field exists, add this item to it
    if (obj[key]) {
      obj[key] = obj[key].concat(item);
    } else {
      // If the field does not exist, create it and this value
      // as an array 
      obj[key] = [item];
    }
  });
  return obj;
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With