size.js

import isTypedArray from './isTypedArray';

/**
 * Get the size of a collection.
 * Note: lodash's size does not check symbol properties and will return unicode length for strings.
 * @param {*} collection 
 * @returns {number}
 */
function size(collection) {
    if (collection == null) {
        return 0;
    }

    const type = typeof collection;

    if (type === 'string') return collection.length;

    if (type === 'object') {
        if (
            Array.isArray(collection) ||
            Buffer.isBuffer(collection) ||
            isTypedArray(collection) ||
            collection.toString() === '[object Arguments]'
        ) {
            return collection.length;
        }

        if (collection instanceof Map || collection instanceof Set) {
            return collection.size;
        }

        if (collection instanceof DataView) {
            return collection.byteLength;
        }

        return Object.keys(collection).length + Object.getOwnPropertySymbols(collection).length;
    }

    return 0;
}

export default size;