|  | var baseTimes = require('./_baseTimes'), | 
|  | isArguments = require('./isArguments'), | 
|  | isArray = require('./isArray'), | 
|  | isBuffer = require('./isBuffer'), | 
|  | isIndex = require('./_isIndex'), | 
|  | isTypedArray = require('./isTypedArray'); | 
|  |  | 
|  | /** Used for built-in method references. */ | 
|  | var objectProto = Object.prototype; | 
|  |  | 
|  | /** Used to check objects for own properties. */ | 
|  | var hasOwnProperty = objectProto.hasOwnProperty; | 
|  |  | 
|  | /** | 
|  | * Creates an array of the enumerable property names of the array-like `value`. | 
|  | * | 
|  | * @private | 
|  | * @param {*} value The value to query. | 
|  | * @param {boolean} inherited Specify returning inherited property names. | 
|  | * @returns {Array} Returns the array of property names. | 
|  | */ | 
|  | function arrayLikeKeys(value, inherited) { | 
|  | var isArr = isArray(value), | 
|  | isArg = !isArr && isArguments(value), | 
|  | isBuff = !isArr && !isArg && isBuffer(value), | 
|  | isType = !isArr && !isArg && !isBuff && isTypedArray(value), | 
|  | skipIndexes = isArr || isArg || isBuff || isType, | 
|  | result = skipIndexes ? baseTimes(value.length, String) : [], | 
|  | length = result.length; | 
|  |  | 
|  | for (var key in value) { | 
|  | if ((inherited || hasOwnProperty.call(value, key)) && | 
|  | !(skipIndexes && ( | 
|  | // Safari 9 has enumerable `arguments.length` in strict mode. | 
|  | key == 'length' || | 
|  | // Node.js 0.10 has enumerable non-index properties on buffers. | 
|  | (isBuff && (key == 'offset' || key == 'parent')) || | 
|  | // PhantomJS 2 has enumerable non-index properties on typed arrays. | 
|  | (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || | 
|  | // Skip index properties. | 
|  | isIndex(key, length) | 
|  | ))) { | 
|  | result.push(key); | 
|  | } | 
|  | } | 
|  | return result; | 
|  | } | 
|  |  | 
|  | module.exports = arrayLikeKeys; |