pbojinov
10/21/2014 - 11:25 PM

jQuery's each method with a shim to check if passed in value is an array

jQuery's each method with a shim to check if passed in value is an array

// jQuery's each method
// https://github.com/jquery/jquery/blob/master/src/core.js#L279
function each(obj, callback, args) {
    var value,
        i = 0,
        length = obj.length,
        isArray = isArraylike(obj);

    if (args) {
        if (isArray) {
            for (; i < length; i++) {
                value = callback.apply(obj[i], args);

                if (value === false) {
                    break;
                }
            }
        } else {
            for (i in obj) {
                value = callback.apply(obj[i], args);

                if (value === false) {
                    break;
                }
            }
        }

        // A special, fast, case for the most common use of each
    } else {
        if (isArray) {
            for (; i < length; i++) {
                value = callback.call(obj[i], i, obj[i]);

                if (value === false) {
                    break;
                }
            }
        } else {
            for (i in obj) {
                value = callback.call(obj[i], i, obj[i]);

                if (value === false) {
                    break;
                }
            }
        }
    }

    return obj;
}

// http://stackoverflow.com/a/4775737/907388
function isArraylike(obj) {
    if (Object.prototype.toString.call(obj) === '[object Array]') {
        return true;
    } else {
        return false;
    }
}