code: function groupBy(array, callback, thisArg) {
      var result = {};
      if (!array) {
        return result;
      }
      var prop,
          value,
          index = -1,
          isFunc = typeof callback == 'function',
          length = array.length;
  
      if (isFunc && thisArg) {
        callback = iteratorBind(callback, thisArg);
      }
      while (++index < length) {
        value = array[index];
        prop = isFunc ? callback(value, index, array) : value[callback];
        (hasOwnProperty.call(result, prop) ? result[prop] : result[prop] = []).push(value);
      }
      return result;
    }
docs: Splits `array` into sets, grouped by the result of running each value
  through `callback`. The `callback` is bound to `thisArg` and invoked with 3
  arguments; (value, index, array). The `callback` argument may also be the
  name of a property to group by.
  
  @static
  @memberOf _
  @category Arrays
  @param {Array} array The array to iterate over.
  @param {Function|String} callback The function called per iteration or
  property name to group by.
  @param {Mixed} [thisArg] The `this` binding for the callback.
  @returns {Object} Returns an object of grouped values.
  @example
  
  _.groupBy([1.3, 2.1, 2.4], function(num) { return Math.floor(num); });
  // => { '1': [1.3], '2': [2.1, 2.4] }
  
  _.groupBy([1.3, 2.1, 2.4], function(num) { return this.floor(num); }, Math);
  // => { '1': [1.3], '2': [2.1, 2.4] }
  
  _.groupBy(['one', 'two', 'three'], 'length');
  // => { '3': ['one', 'two'], '5': ['three'] }