foop
Version:
interfaces that describe their intentions.
75 lines (73 loc) • 8.98 kB
JavaScript
/* eslint guard-for-in: "OFF" */
/* eslint no-unused-expressions: "OFF" */
var isNil = require('../is/nullOrUndefined')
var isNumberPrimitive = require('../is/numberPrimitive')
var toLength = require('../cast/toLength')
var hasOwnProperty = require('../util/hasOwnProperty')
var hasIn = require('../is/hasIn')
/**
* @desc returns .length, .size, or a number with the length from `for in` hasOwn
* @name size
* @memberOf util
* @since 5.0.0-beta.6
*
* @param {Object|Array|Map|*} x value to check length | size
* @return {number} size
*
* {@link http://whereswalden.com/2010/04/06/more-changes-coming-to-spidermonkey-the-magical-__count__-property-of-objects-is-being-removed/ spidermonkey__count__}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/size mozilla-map-size}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/size mozilla-set-size}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length mozilla-function-length}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length mozilla-array-length}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/length mozilla-arguments-length}
* {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length mozilla-string-length}
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L476 underscore-size}
* {@link https://github.com/lodash/lodash/blob/master/size.js lodash-size}
* {@link https://stackoverflow.com/questions/31014793/is-lodash-size-faster-than-js-length-property stack-overflow-size}
* @see {@link spidermonkey__count__}
* @see {@link underscore-size}
* @see {@link stack-overflow-size}
* @see {@link lodash-size}
* @see {@link mozilla-string-length}
* @see {@link mozilla-array-length}
* @see {@link mozilla-arguments-length}
* @see {@link mozilla-function-length}
* @see {@link mozilla-set-size}
* @see {@link mozilla-map-size}
*
* @example
* size(new Set([0, 1])) //=> 2
* size(new Map(Object.entries({eh: true}))) //=> 1
* size({eh: 0}) //=> 1
* size({}) //=> 0
* size([]) //=> 0
* size([0, 1, 2]) //=> 3
* size(($1, $2) => {}) //=> 2
* size(() => {}) //=> 0
* size(null) //=> 0
*/
module.exports = function size(x) {
// --- safety all around
// decision tree, but sadly, bigger size :,-(
if (isNil(x)) {
return 0
}
// @NOTE could put `isPrimitive` after the length and size checks...
// but not really needed because look at `toNumber` & +false = 0 etc so
else if (isNumberPrimitive(x)) {
return toLength(x)
}
// --- main checks .length, .size, or for-in
else if (hasIn(x, 'length')) {
return x.length
}
else if (hasIn(x, 'size')) {
return x.size
}
else {
var count = 0
for (var property in x) { hasOwnProperty(x, property) && ++count }
return count
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6ZS5qcyIsInNvdXJjZXMiOlsic2l6ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgZ3VhcmQtZm9yLWluOiBcIk9GRlwiICovXG4vKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIk9GRlwiICovXG5jb25zdCBpc05pbCA9IHJlcXVpcmUoJy4uL2lzL251bGxPclVuZGVmaW5lZCcpXG5jb25zdCBpc051bWJlclByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2lzL251bWJlclByaW1pdGl2ZScpXG5jb25zdCB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2Nhc3QvdG9MZW5ndGgnKVxuY29uc3QgaGFzT3duUHJvcGVydHkgPSByZXF1aXJlKCcuLi91dGlsL2hhc093blByb3BlcnR5JylcbmNvbnN0IGhhc0luID0gcmVxdWlyZSgnLi4vaXMvaGFzSW4nKVxuXG4vKipcbiAqIEBkZXNjIHJldHVybnMgLmxlbmd0aCwgLnNpemUsIG9yIGEgbnVtYmVyIHdpdGggdGhlIGxlbmd0aCBmcm9tIGBmb3IgaW5gIGhhc093blxuICogQG5hbWUgc2l6ZVxuICogQG1lbWJlck9mIHV0aWxcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjZcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R8QXJyYXl8TWFwfCp9IHggdmFsdWUgdG8gY2hlY2sgbGVuZ3RoIHwgc2l6ZVxuICogQHJldHVybiB7bnVtYmVyfSBzaXplXG4gKlxuICoge0BsaW5rIGh0dHA6Ly93aGVyZXN3YWxkZW4uY29tLzIwMTAvMDQvMDYvbW9yZS1jaGFuZ2VzLWNvbWluZy10by1zcGlkZXJtb25rZXktdGhlLW1hZ2ljYWwtX19jb3VudF9fLXByb3BlcnR5LW9mLW9iamVjdHMtaXMtYmVpbmctcmVtb3ZlZC8gc3BpZGVybW9ua2V5X19jb3VudF9ffVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcC9zaXplIG1vemlsbGEtbWFwLXNpemV9XG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU2V0L3NpemUgbW96aWxsYS1zZXQtc2l6ZX1cbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9sZW5ndGggbW96aWxsYS1mdW5jdGlvbi1sZW5ndGh9XG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvbGVuZ3RoIG1vemlsbGEtYXJyYXktbGVuZ3RofVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0Z1bmN0aW9ucy9hcmd1bWVudHMvbGVuZ3RoIG1vemlsbGEtYXJndW1lbnRzLWxlbmd0aH1cbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbGVuZ3RoIG1vemlsbGEtc3RyaW5nLWxlbmd0aH1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvYmxvYi9tYXN0ZXIvdW5kZXJzY29yZS5qcyNMNDc2IHVuZGVyc2NvcmUtc2l6ZX1cbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci9zaXplLmpzIGxvZGFzaC1zaXplfVxuICoge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMxMDE0NzkzL2lzLWxvZGFzaC1zaXplLWZhc3Rlci10aGFuLWpzLWxlbmd0aC1wcm9wZXJ0eSBzdGFjay1vdmVyZmxvdy1zaXplfVxuICogQHNlZSB7QGxpbmsgc3BpZGVybW9ua2V5X19jb3VudF9ffVxuICogQHNlZSB7QGxpbmsgdW5kZXJzY29yZS1zaXplfVxuICogQHNlZSB7QGxpbmsgc3RhY2stb3ZlcmZsb3ctc2l6ZX1cbiAqIEBzZWUge0BsaW5rIGxvZGFzaC1zaXplfVxuICogQHNlZSB7QGxpbmsgbW96aWxsYS1zdHJpbmctbGVuZ3RofVxuICogQHNlZSB7QGxpbmsgbW96aWxsYS1hcnJheS1sZW5ndGh9XG4gKiBAc2VlIHtAbGluayBtb3ppbGxhLWFyZ3VtZW50cy1sZW5ndGh9XG4gKiBAc2VlIHtAbGluayBtb3ppbGxhLWZ1bmN0aW9uLWxlbmd0aH1cbiAqIEBzZWUge0BsaW5rIG1vemlsbGEtc2V0LXNpemV9XG4gKiBAc2VlIHtAbGluayBtb3ppbGxhLW1hcC1zaXplfVxuICpcbiAqIEBleGFtcGxlXG4gKiAgICBzaXplKG5ldyBTZXQoWzAsIDFdKSkgICAgICAgICAgICAgICAgICAgICAvLz0+IDJcbiAqICAgIHNpemUobmV3IE1hcChPYmplY3QuZW50cmllcyh7ZWg6IHRydWV9KSkpIC8vPT4gMVxuICogICAgc2l6ZSh7ZWg6IDB9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAxXG4gKiAgICBzaXplKHt9KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+IDBcbiAqICAgIHNpemUoW10pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gMFxuICogICAgc2l6ZShbMCwgMSwgMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAzXG4gKiAgICBzaXplKCgkMSwgJDIpID0+IHt9KSAgICAgICAgICAgICAgICAgICAgICAvLz0+IDJcbiAqICAgIHNpemUoKCkgPT4ge30pICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gMFxuICogICAgc2l6ZShudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2l6ZSh4KSB7XG4gIC8vIC0tLSBzYWZldHkgYWxsIGFyb3VuZFxuICAvLyBkZWNpc2lvbiB0cmVlLCBidXQgc2FkbHksIGJpZ2dlciBzaXplIDosLShcbiAgaWYgKGlzTmlsKHgpKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICAvLyBATk9URSBjb3VsZCBwdXQgYGlzUHJpbWl0aXZlYCBhZnRlciB0aGUgbGVuZ3RoIGFuZCBzaXplIGNoZWNrcy4uLlxuICAvLyBidXQgbm90IHJlYWxseSBuZWVkZWQgYmVjYXVzZSBsb29rIGF0IGB0b051bWJlcmAgJiArZmFsc2UgPSAwIGV0YyBzb1xuICBlbHNlIGlmIChpc051bWJlclByaW1pdGl2ZSh4KSkge1xuICAgIHJldHVybiB0b0xlbmd0aCh4KVxuICB9XG4gIC8vIC0tLSBtYWluIGNoZWNrcyAubGVuZ3RoLCAuc2l6ZSwgb3IgZm9yLWluXG4gIGVsc2UgaWYgKGhhc0luKHgsICdsZW5ndGgnKSkge1xuICAgIHJldHVybiB4Lmxlbmd0aFxuICB9XG4gIGVsc2UgaWYgKGhhc0luKHgsICdzaXplJykpIHtcbiAgICByZXR1cm4geC5zaXplXG4gIH1cbiAgZWxzZSB7XG4gICAgbGV0IGNvdW50ID0gMFxuICAgIGZvciAobGV0IHByb3BlcnR5IGluIHgpIGhhc093blByb3BlcnR5KHgsIHByb3BlcnR5KSAmJiArK2NvdW50XG4gICAgcmV0dXJuIGNvdW50XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUFBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDO0FBQzlDQSxHQUFLLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDO0FBQzFEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUM7QUFDeERBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDcEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7OztFQUdoQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNaLE9BQU8sQ0FBQztHQUNUOzs7T0FHSSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzdCLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQztHQUNuQjs7T0FFSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUU7SUFDM0IsT0FBTyxDQUFDLENBQUMsTUFBTTtHQUNoQjtPQUNJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRTtJQUN6QixPQUFPLENBQUMsQ0FBQyxJQUFJO0dBQ2Q7T0FDSTtJQUNIQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDYixLQUFLQSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFBLGNBQWMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUE7SUFDOUQsT0FBTyxLQUFLO0dBQ2I7Q0FDRjsifQ==