function keysIn(object) {
      if (object == null) {
        return [];
      }
      if (!isObject(object)) {
        object = Object(object);
      }
      var length = object.length;
      length = (length && isLength(length) &&
        (isArray(object) || isArguments(object)) && length) || 0;

      var Ctor = object.constructor,
          index = -1,
          isProto = typeof Ctor == 'function' && Ctor.prototype === object,
          result = Array(length),
          skipIndexes = length > 0;

      while (++index < length) {
        result[index] = (index + '');
      }
      for (var key in object) {
        if (!(skipIndexes && isIndex(key, length)) &&
            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
          result.push(key);
        }
      }
      return result;
    }
The opposite of `_.mapValues`; this method creates an object with the
same values as `object` and keys generated by running each own enumerable
property of `object` through `iteratee`.

@static
@memberOf _
@category Object
@param {Object} object The object to iterate over.
@param {Function|Object|string} [iteratee=_.identity] The function invoked
 per iteration.
@param {*} [thisArg] The `this` binding of `iteratee`.
@returns {Object} Returns the new mapped object.
@example

_.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
  return key + value;
});
// => { 'a1': 1, 'b2': 2 }