foop
Version:
interfaces that describe their intentions.
89 lines (86 loc) • 7.98 kB
JavaScript
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=