UNPKG

foop

Version:

interfaces that describe their intentions.

89 lines (86 loc) 7.98 kB
var lengthMinusOne = require('../util/lengthMinusOne') var hasOwnProperty = require('../util/hasOwnProperty') var length = require('../util/length') var isArray = require('./array') var isString = require('./string') var isPureObj = require('./objPure') var isReal = require('./real') // const isElement = require('./element') /** * @desc Tests whether or not an object is similar to an array. * @name isArrayLike * @memberOf is * @since 5.0.0-beta.5 * @alias isArrayIsh * * @param {Array | Object | *} arg object to test * @return {boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise. * * @func * @type {Function} * * {@link https://github.com/ramda/ramda/blob/master/src/internal/_isArrayLike.js ramda-is-array-like} * {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L165 underscore-is-array-like} * {@link https://github.com/lodash/lodash/blob/master/isArrayLike.js lodash-is-array-like} * {@link https://github.com/mobxjs/mobx/blob/master/src/utils/utils.ts#L210 mobx-is-array-like} * {@link https://github.com/facebook/immutable-js/blob/master/src/utils/isArrayLike.js immutables-is-array-like} * @see {@link immutables-is-array-like} * @see {@link mobx-is-array-like} * @see {@link lodash-is-array-like} * @see {@link underscore-is-array-like} * @see {@link ramda-is-array-like} * * @category Type * @category List * @sig * -> Boolean * * @example * * isArrayLike([]); //=> true * isArrayLike(true); //=> false * isArrayLike({}); //=> false * isArrayLike({length: 10}); //=> false * isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true * */ module.exports = function isArrayLike(x) { if (!isReal(x)) { return false } else if (isArray(x)) { return true } else if (!isPureObj(x)) { return false } else if (isString(x)) { return false } // ignoring because it's pretty big // else if (isElement(x)) { // return !!x.length // } else if (length(x) === 0) { return true } // has [0] & [1] else if (length(x) > 0) { return hasOwnProperty(x, 0) && hasOwnProperty(x, lengthMinusOne(x)) } else { return false } } // from underscore // Helper for collection methods to determine whether a collection // should be iterated as an array or as an object. // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 // var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1 // var getLength = shallowProperty('length') // var isArrayLike = function(collection) { // var length = getLength(collection) // return isNumber(length) && length >= 0 && length <= MAX_ARRAY_INDEX // } // //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlMaWtlLmpzIiwic291cmNlcyI6WyJhcnJheUxpa2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbGVuZ3RoTWludXNPbmUgPSByZXF1aXJlKCcuLi91dGlsL2xlbmd0aE1pbnVzT25lJylcbmNvbnN0IGhhc093blByb3BlcnR5ID0gcmVxdWlyZSgnLi4vdXRpbC9oYXNPd25Qcm9wZXJ0eScpXG5jb25zdCBsZW5ndGggPSByZXF1aXJlKCcuLi91dGlsL2xlbmd0aCcpXG5jb25zdCBpc0FycmF5ID0gcmVxdWlyZSgnLi9hcnJheScpXG5jb25zdCBpc1N0cmluZyA9IHJlcXVpcmUoJy4vc3RyaW5nJylcbmNvbnN0IGlzUHVyZU9iaiA9IHJlcXVpcmUoJy4vb2JqUHVyZScpXG5jb25zdCBpc1JlYWwgPSByZXF1aXJlKCcuL3JlYWwnKVxuLy8gY29uc3QgaXNFbGVtZW50ID0gcmVxdWlyZSgnLi9lbGVtZW50JylcblxuLyoqXG4gKiBAZGVzYyBUZXN0cyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaXMgc2ltaWxhciB0byBhbiBhcnJheS5cbiAqIEBuYW1lIGlzQXJyYXlMaWtlXG4gKiBAbWVtYmVyT2YgaXNcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjVcbiAqIEBhbGlhcyBpc0FycmF5SXNoXG4gKlxuICogQHBhcmFtIHtBcnJheSB8IE9iamVjdCB8ICp9IGFyZyBvYmplY3QgdG8gdGVzdFxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIGB4YCBoYXMgYSBudW1lcmljIGxlbmd0aCBwcm9wZXJ0eSBhbmQgZXh0cmVtZSBpbmRpY2VzIGRlZmluZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAdHlwZSB7RnVuY3Rpb259XG4gKlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9yYW1kYS9yYW1kYS9ibG9iL21hc3Rlci9zcmMvaW50ZXJuYWwvX2lzQXJyYXlMaWtlLmpzIHJhbWRhLWlzLWFycmF5LWxpa2V9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvbWFzdGVyL3VuZGVyc2NvcmUuanMjTDE2NSB1bmRlcnNjb3JlLWlzLWFycmF5LWxpa2V9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvaXNBcnJheUxpa2UuanMgbG9kYXNoLWlzLWFycmF5LWxpa2V9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21vYnhqcy9tb2J4L2Jsb2IvbWFzdGVyL3NyYy91dGlscy91dGlscy50cyNMMjEwIG1vYngtaXMtYXJyYXktbGlrZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzL2Jsb2IvbWFzdGVyL3NyYy91dGlscy9pc0FycmF5TGlrZS5qcyBpbW11dGFibGVzLWlzLWFycmF5LWxpa2V9XG4gKiBAc2VlIHtAbGluayBpbW11dGFibGVzLWlzLWFycmF5LWxpa2V9XG4gKiBAc2VlIHtAbGluayBtb2J4LWlzLWFycmF5LWxpa2V9XG4gKiBAc2VlIHtAbGluayBsb2Rhc2gtaXMtYXJyYXktbGlrZX1cbiAqIEBzZWUge0BsaW5rIHVuZGVyc2NvcmUtaXMtYXJyYXktbGlrZX1cbiAqIEBzZWUge0BsaW5rIHJhbWRhLWlzLWFycmF5LWxpa2V9XG4gKlxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICogLT4gQm9vbGVhblxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBpc0FycmF5TGlrZShbXSk7IC8vPT4gdHJ1ZVxuICogICAgICBpc0FycmF5TGlrZSh0cnVlKTsgLy89PiBmYWxzZVxuICogICAgICBpc0FycmF5TGlrZSh7fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgaXNBcnJheUxpa2Uoe2xlbmd0aDogMTB9KTsgLy89PiBmYWxzZVxuICogICAgICBpc0FycmF5TGlrZSh7MDogJ3plcm8nLCA5OiAnbmluZScsIGxlbmd0aDogMTB9KTsgLy89PiB0cnVlXG4gKlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHgpIHtcbiAgaWYgKCFpc1JlYWwoeCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBlbHNlIGlmIChpc0FycmF5KHgpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBlbHNlIGlmICghaXNQdXJlT2JqKHgpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZWxzZSBpZiAoaXNTdHJpbmcoeCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBpZ25vcmluZyBiZWNhdXNlIGl0J3MgcHJldHR5IGJpZ1xuICAvLyBlbHNlIGlmIChpc0VsZW1lbnQoeCkpIHtcbiAgLy8gICByZXR1cm4gISF4Lmxlbmd0aFxuICAvLyB9XG4gIGVsc2UgaWYgKGxlbmd0aCh4KSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgLy8gaGFzIFswXSAmIFsxXVxuICBlbHNlIGlmIChsZW5ndGgoeCkgPiAwKSB7XG4gICAgcmV0dXJuIGhhc093blByb3BlcnR5KHgsIDApICYmIGhhc093blByb3BlcnR5KHgsIGxlbmd0aE1pbnVzT25lKHgpKVxuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIGZyb20gdW5kZXJzY29yZVxuLy8gSGVscGVyIGZvciBjb2xsZWN0aW9uIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb2xsZWN0aW9uXG4vLyBzaG91bGQgYmUgaXRlcmF0ZWQgYXMgYW4gYXJyYXkgb3IgYXMgYW4gb2JqZWN0LlxuLy8gUmVsYXRlZDogaHR0cDovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9sZW5ndGhcbi8vIEF2b2lkcyBhIHZlcnkgbmFzdHkgaU9TIDggSklUIGJ1ZyBvbiBBUk0tNjQuICMyMDk0XG4vLyB2YXIgTUFYX0FSUkFZX0lOREVYID0gTWF0aC5wb3coMiwgNTMpIC0gMVxuLy8gdmFyIGdldExlbmd0aCA9IHNoYWxsb3dQcm9wZXJ0eSgnbGVuZ3RoJylcbi8vIHZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24pIHtcbi8vICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChjb2xsZWN0aW9uKVxuLy8gICByZXR1cm4gaXNOdW1iZXIobGVuZ3RoKSAmJiBsZW5ndGggPj0gMCAmJiBsZW5ndGggPD0gTUFYX0FSUkFZX0lOREVYXG4vLyB9XG4vL1xuIl0sIm5hbWVzIjpbImNvbnN0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUM7QUFDeERBLEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDO0FBQ3hEQSxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN4Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDcENBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUN0Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NoQyxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRTtFQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2QsT0FBTyxLQUFLO0dBQ2I7T0FDSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNuQixPQUFPLElBQUk7R0FDWjtPQUNJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDdEIsT0FBTyxLQUFLO0dBQ2I7T0FDSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNwQixPQUFPLEtBQUs7R0FDYjs7Ozs7T0FLSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDeEIsT0FBTyxJQUFJO0dBQ1o7O09BRUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3RCLE9BQU8sY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUNwRTtPQUNJO0lBQ0gsT0FBTyxLQUFLO0dBQ2I7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7In0=