code: function groupBy(collection, callback, thisArg) {
        var result = {};
        callback = lodash.createCallback(callback, thisArg);
  
        forEach(collection, function(value, key, collection) {
          key = String(callback(value, key, collection));
          (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
        });
        return result;
      }
docs: Creates an object composed of keys returned from running each element of the
  `collection` through the `callback`. The corresponding value of each key is
  an array of elements passed to `callback` that returned the key. The `callback`
  is bound to `thisArg` and invoked with three arguments; (value, index|key, collection).
  
  If a property name is passed for `callback`, the created "_.pluck" style
  callback will return the property value of the given element.
  
  If an object is passed for `callback`, the created "_.where" style callback
  will return `true` for elements that have the properties of the given object,
  else `false`
  
  @static
  @memberOf _
  @category Collections
  @param {Array|Object|String} collection The collection to iterate over.
  @param {Function|Object|String} [callback=identity] The function called per
  iteration. If a property name or object is passed, it will be used to create
  a "_.pluck" or "_.where" style callback, respectively.
  @param {Mixed} [thisArg] The `this` binding of `callback`.
  @returns {Object} Returns the composed aggregate object.
  @example
  
  _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
  // => { '4': [4.2], '6': [6.1, 6.4] }
  
  _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
  // => { '4': [4.2], '6': [6.1, 6.4] }
  
  // using "_.pluck" callback shorthand
  _.groupBy(['one', 'two', 'three'], 'length');
  // => { '3': ['one', 'two'], '5': ['three'] }