lodash.js

license lodash
3.10.0 (Custom Build) https://lodash.com/ Build: lodash modern -o ./lodash.js Copyright 2012-2015 The Dojo Foundation http://dojofoundation.org/ Based on Underscore.js 1.8.3 http://underscorejs.org/LICENSE Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Available under MIT license https://lodash.com/license
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '3.10.0';

  /** Used to compose bitmasks for wrapper metadata. */
  var BIND_FLAG = 1,
      BIND_KEY_FLAG = 2,
      CURRY_BOUND_FLAG = 4,
      CURRY_FLAG = 8,
      CURRY_RIGHT_FLAG = 16,
      PARTIAL_FLAG = 32,
      PARTIAL_RIGHT_FLAG = 64,
      ARY_FLAG = 128,
      REARG_FLAG = 256;

  /** Used as default options for `_.trunc`. */
  var DEFAULT_TRUNC_LENGTH = 30,
      DEFAULT_TRUNC_OMISSION = '...';

  /** Used to detect when a function becomes hot. */
  var HOT_COUNT = 150,
      HOT_SPAN = 16;

  /** Used as the size to enable large array optimizations. */
  var LARGE_ARRAY_SIZE = 200;

  /** Used to indicate the type of lazy iteratees. */
  var LAZY_FILTER_FLAG = 1,
      LAZY_MAP_FLAG = 2;

  /** Used as the `TypeError` message for "Functions" methods. */
  var FUNC_ERROR_TEXT = 'Expected a function';

  /** Used as the internal argument placeholder. */
  var PLACEHOLDER = '__lodash_placeholder__';

  /** `Object#toString` result references. */
  var argsTag = '[object Arguments]',
      arrayTag = '[object Array]',
      boolTag = '[object Boolean]',
      dateTag = '[object Date]',
      errorTag = '[object Error]',
      funcTag = '[object Function]',
      mapTag = '[object Map]',
      numberTag = '[object Number]',
      objectTag = '[object Object]',
      regexpTag = '[object RegExp]',
      setTag = '[object Set]',
      stringTag = '[object String]',
      weakMapTag = '[object WeakMap]';

  var arrayBufferTag = '[object ArrayBuffer]',
      float32Tag = '[object Float32Array]',
      float64Tag = '[object Float64Array]',
      int8Tag = '[object Int8Array]',
      int16Tag = '[object Int16Array]',
      int32Tag = '[object Int32Array]',
      uint8Tag = '[object Uint8Array]',
      uint8ClampedTag = '[object Uint8ClampedArray]',
      uint16Tag = '[object Uint16Array]',
      uint32Tag = '[object Uint32Array]';

  /** Used to match empty string literals in compiled template source. */
  var reEmptyStringLeading = /\b__p \+= '';/g,
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;

  /** Used to match HTML entities and HTML characters. */
  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
      reUnescapedHtml = /[&<>"'`]/g,
      reHasEscapedHtml = RegExp(reEscapedHtml.source),
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

  /** Used to match template delimiters. */
  var reEscape = /<%-([\s\S]+?)%>/g,
      reEvaluate = /<%([\s\S]+?)%>/g,
      reInterpolate = /<%=([\s\S]+?)%>/g;

  /** Used to match property names within property paths. */
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
      reIsPlainProp = /^\w*$/,
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;


Used to match RegExp syntax characters and those outlined by EscapeRegExpPattern.

  var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,
      reHasRegExpChars = RegExp(reRegExpChars.source);


Used to match combining diacritical marks.
var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;

/* Used to match backslashes in property paths. /

  var reEscapeChar = /\\(\\)?/g;

  /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;

  /** Used to match `RegExp` flags from their coerced string values. */
  var reFlags = /\w*$/;

  /** Used to detect hexadecimal string values. */
  var reHasHexPrefix = /^0[xX]/;

  /** Used to detect host constructors (Safari > 5). */
  var reIsHostCtor = /^\[object .+?Constructor\]$/;

  /** Used to detect unsigned integer values. */
  var reIsUint = /^\d+$/;

  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
  var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;

  /** Used to ensure capturing order of template delimiters. */
  var reNoMatch = /($^)/;

  /** Used to match unescaped characters in compiled string literals. */
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;

  /** Used to match words to create compound words. */
  var reWords = (function() {
    var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
        lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';

    return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
  }());

  /** Used to assign default `context` object properties. */
  var contextProps = [
    'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
    'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite',
    'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap'
  ];

  /** Used to make template sourceURLs easier to identify. */
  var templateCounter = -1;

  /** Used to identify `toStringTag` values of typed arrays. */
  var typedArrayTags = {};
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
  typedArrayTags[uint32Tag] = true;
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
  typedArrayTags[dateTag] = typedArrayTags[errorTag] =
  typedArrayTags[funcTag] = typedArrayTags[mapTag] =
  typedArrayTags[numberTag] = typedArrayTags[objectTag] =
  typedArrayTags[regexpTag] = typedArrayTags[setTag] =
  typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;

  /** Used to identify `toStringTag` values supported by `_.clone`. */
  var cloneableTags = {};
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
  cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
  cloneableTags[dateTag] = cloneableTags[float32Tag] =
  cloneableTags[float64Tag] = cloneableTags[int8Tag] =
  cloneableTags[int16Tag] = cloneableTags[int32Tag] =
  cloneableTags[numberTag] = cloneableTags[objectTag] =
  cloneableTags[regexpTag] = cloneableTags[stringTag] =
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
  cloneableTags[errorTag] = cloneableTags[funcTag] =
  cloneableTags[mapTag] = cloneableTags[setTag] =
  cloneableTags[weakMapTag] = false;

  /** Used to map latin-1 supplementary letters to basic latin letters. */
  var deburredLetters = {
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
    '\xc7': 'C',  '\xe7': 'c',
    '\xd0': 'D',  '\xf0': 'd',
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
    '\xcC': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
    '\xeC': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
    '\xd1': 'N',  '\xf1': 'n',
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
    '\xc6': 'Ae', '\xe6': 'ae',
    '\xde': 'Th', '\xfe': 'th',
    '\xdf': 'ss'
  };

  /** Used to map characters to HTML entities. */
  var htmlEscapes = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;',
    '`': '&#96;'
  };

  /** Used to map HTML entities to characters. */
  var htmlUnescapes = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
    '&quot;': '"',
    '&#39;': "'",
    '&#96;': '`'
  };

  /** Used to determine if values are of the language type `Object`. */
  var objectTypes = {
    'function': true,
    'object': true
  };

  /** Used to escape characters for inclusion in compiled regexes. */
  var regexpEscapes = {
    '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',
    '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',
    'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',
    'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',
    'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'
  };

  /** Used to escape characters for inclusion in compiled string literals. */
  var stringEscapes = {
    '\\': '\\',
    "'": "'",
    '\n': 'n',
    '\r': 'r',
    '\u2028': 'u2028',
    '\u2029': 'u2029'
  };

  /** Detect free variable `exports`. */
  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;

  /** Detect free variable `module`. */
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;

  /** Detect free variable `global` from Node.js. */
  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;

  /** Detect free variable `self`. */
  var freeSelf = objectTypes[typeof self] && self && self.Object && self;

  /** Detect free variable `window`. */
  var freeWindow = objectTypes[typeof window] && window && window.Object && window;

  /** Detect the popular CommonJS extension `module.exports`. */
  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;


Used as a reference to the global object.

The this value is used if it's the global object to avoid Greasemonkey's restricted window object, otherwise the window object is used.

  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;

  /*--------------------------------------------------------------------------*/


The base implementation of compareAscending which compares values and sorts them in ascending order without guaranteeing a stable sort.

API
private
Params
value The value to compare.
other The other value to compare.
Returns
number Returns the sort order indicator for value.
  function baseCompareAscending(value, other) {
    if (value !== other) {
      var valIsNull = value === null,
          valIsUndef = value === undefined,
          valIsReflexive = value === value;

      var othIsNull = other === null,
          othIsUndef = other === undefined,
          othIsReflexive = other === other;

      if ((value > other && !othIsNull) || !valIsReflexive ||
          (valIsNull && !othIsUndef && othIsReflexive) ||
          (valIsUndef && othIsReflexive)) {
        return 1;
      }
      if ((value < other && !valIsNull) || !othIsReflexive ||
          (othIsNull && !valIsUndef && valIsReflexive) ||
          (othIsUndef && valIsReflexive)) {
        return -1;
      }
    }
    return 0;
  }


The base implementation of .findIndex and .findLastIndex without support for callback shorthands and this binding.

API
private
Params
array Array The array to search.
predicate Function The function invoked per iteration.
[fromRight] boolean Specify iterating from right to left.
Returns
number Returns the index of the matched value, else -1.
  function baseFindIndex(array, predicate, fromRight) {
    var length = array.length,
        index = fromRight ? length : -1;

    while ((fromRight ? index-- : ++index < length)) {
      if (predicate(array[index], index, array)) {
        return index;
      }
    }
    return -1;
  }


The base implementation of _.indexOf without support for binary searches.

API
private
Params
array Array The array to search.
value * The value to search for.
fromIndex number The index to search from.
Returns
number Returns the index of the matched value, else -1.
  function baseIndexOf(array, value, fromIndex) {
    if (value !== value) {
      return indexOfNaN(array, fromIndex);
    }
    var index = fromIndex - 1,
        length = array.length;

    while (++index < length) {
      if (array[index] === value) {
        return index;
      }
    }
    return -1;
  }


The base implementation of _.isFunction without support for environments with incorrect typeof results.

API
private
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
  function baseIsFunction(value) {

Avoid a Chakra JIT bug in compatibility modes of IE 11. See https://github.com/jashkenas/underscore/issues/1621 for more details.

    return typeof value == 'function' || false;
  }


Converts value to a string if it's not one. An empty string is returned for null or undefined values.

API
private
Params
value * The value to process.
Returns
string Returns the string.
  function baseToString(value) {
    return value == null ? '' : (value + '');
  }


Used by .trim and .trimLeft to get the index of the first character of string that is not found in chars.

API
private
Params
string string The string to inspect.
chars string The characters to find.
Returns
number Returns the index of the first character not found in chars.
  function charsLeftIndex(string, chars) {
    var index = -1,
        length = string.length;

    while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
    return index;
  }


Used by .trim and .trimRight to get the index of the last character of string that is not found in chars.

API
private
Params
string string The string to inspect.
chars string The characters to find.
Returns
number Returns the index of the last character not found in chars.
  function charsRightIndex(string, chars) {
    var index = string.length;

    while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
    return index;
  }


Used by _.sortBy to compare transformed elements of a collection and stable sort them in ascending order.

API
private
Params
object Object The object to compare.
other Object The other object to compare.
Returns
number Returns the sort order indicator for object.
  function compareAscending(object, other) {
    return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
  }


Used by _.sortByOrder to compare multiple properties of a value to another and stable sort them.

If orders is unspecified, all valuess are sorted in ascending order. Otherwise, a value is sorted in ascending order if its corresponding order is "asc", and descending if "desc".

API
private
Params
object Object The object to compare.
other Object The other object to compare.
orders boolean[] The order to sort by for each property.
Returns
number Returns the sort order indicator for object.
  function compareMultiple(object, other, orders) {
    var index = -1,
        objCriteria = object.criteria,
        othCriteria = other.criteria,
        length = objCriteria.length,
        ordersLength = orders.length;

    while (++index < length) {
      var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
      if (result) {
        if (index >= ordersLength) {
          return result;
        }
        var order = orders[index];
        return result * ((order === 'asc' || order === true) ? 1 : -1);
      }
    }

Fixes an Array#sort bug in the JS engine embedded in Adobe applications that causes it, under certain circumstances, to provide the same value for object and other. See https://github.com/jashkenas/underscore/pull/1247 for more details.

This also ensures a stable sort in V8 and other engines. See https://code.google.com/p/v8/issues/detail?id=90 for more details.

    return object.index - other.index;
  }


Used by _.deburr to convert latin-1 supplementary letters to basic latin letters.

API
private
Params
letter string The matched letter to deburr.
Returns
string Returns the deburred letter.
  function deburrLetter(letter) {
    return deburredLetters[letter];
  }


Used by _.escape to convert characters to HTML entities.

API
private
Params
chr string The matched character to escape.
Returns
string Returns the escaped character.
  function escapeHtmlChar(chr) {
    return htmlEscapes[chr];
  }


Used by _.escapeRegExp to escape characters for inclusion in compiled regexes.

API
private
Params
chr string The matched character to escape.
leadingChar string The capture group for a leading character.
whitespaceChar string The capture group for a whitespace character.
Returns
string Returns the escaped character.
  function escapeRegExpChar(chr, leadingChar, whitespaceChar) {
    if (leadingChar) {
      chr = regexpEscapes[chr];
    } else if (whitespaceChar) {
      chr = stringEscapes[chr];
    }
    return '\\' + chr;
  }


Used by _.template to escape characters for inclusion in compiled string literals.

API
private
Params
chr string The matched character to escape.
Returns
string Returns the escaped character.
  function escapeStringChar(chr) {
    return '\\' + stringEscapes[chr];
  }


Gets the index at which the first occurrence of NaN is found in array.

API
private
Params
array Array The array to search.
fromIndex number The index to search from.
[fromRight] boolean Specify iterating from right to left.
Returns
number Returns the index of the matched NaN, else -1.
  function indexOfNaN(array, fromIndex, fromRight) {
    var length = array.length,
        index = fromIndex + (fromRight ? 0 : -1);

    while ((fromRight ? index-- : ++index < length)) {
      var other = array[index];
      if (other !== other) {
        return index;
      }
    }
    return -1;
  }


Checks if value is object-like.

API
private
Params
value * The value to check.
Returns
boolean Returns true if value is object-like, else false.
  function isObjectLike(value) {
    return !!value && typeof value == 'object';
  }


Used by trimmedLeftIndex and trimmedRightIndex to determine if a character code is whitespace.

API
private
Params
charCode number The character code to inspect.
Returns
boolean Returns true if charCode is whitespace, else false.
  function isSpace(charCode) {
    return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||
      (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));
  }


Replaces all placeholder elements in array with an internal placeholder and returns an array of their indexes.

API
private
Params
array Array The array to modify.
placeholder * The placeholder to replace.
Returns
Array Returns the new array of placeholder indexes.
  function replaceHolders(array, placeholder) {
    var index = -1,
        length = array.length,
        resIndex = -1,
        result = [];

    while (++index < length) {
      if (array[index] === placeholder) {
        array[index] = PLACEHOLDER;
        result[++resIndex] = index;
      }
    }
    return result;
  }


An implementation of _.uniq optimized for sorted arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to inspect.
[iteratee] Function The function invoked per iteration.
Returns
Array Returns the new duplicate-value-free array.
  function sortedUniq(array, iteratee) {
    var seen,
        index = -1,
        length = array.length,
        resIndex = -1,
        result = [];

    while (++index < length) {
      var value = array[index],
          computed = iteratee ? iteratee(value, index, array) : value;

      if (!index || seen !== computed) {
        seen = computed;
        result[++resIndex] = value;
      }
    }
    return result;
  }


Used by .trim and .trimLeft to get the index of the first non-whitespace character of string.

API
private
Params
string string The string to inspect.
Returns
number Returns the index of the first non-whitespace character.
  function trimmedLeftIndex(string) {
    var index = -1,
        length = string.length;

    while (++index < length && isSpace(string.charCodeAt(index))) {}
    return index;
  }


Used by .trim and .trimRight to get the index of the last non-whitespace character of string.

API
private
Params
string string The string to inspect.
Returns
number Returns the index of the last non-whitespace character.
  function trimmedRightIndex(string) {
    var index = string.length;

    while (index-- && isSpace(string.charCodeAt(index))) {}
    return index;
  }


Used by _.unescape to convert HTML entities to characters.

API
private
Params
chr string The matched character to unescape.
Returns
string Returns the unescaped character.
  function unescapeHtmlChar(chr) {
    return htmlUnescapes[chr];
  }

  /*--------------------------------------------------------------------------*/


Create a new pristine lodash function using the given context object.

static
memberOf
category
Utility
Params
[context=root] Object The context object.
Returns
Function Returns a new lodash function.
example .mixin({
'foo': .constant('foo') }); var lodash = .runInContext(); lodash.mixin({ 'bar': lodash.constant('bar') }); .isFunction(.foo); // => true .isFunction(.bar); // => false lodash.isFunction(lodash.foo); // => false lodash.isFunction(lodash.bar); // => true // using context to mock Date#getTime use in .now var mock = .runInContext({ 'Date': function() { return { 'getTime': getTimeMock }; } }); // or creating a suped-up defer in Node.js var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
  function runInContext(context) {

Avoid issues with some ES3 environments that attempt to use values, named after built-in constructors like Object, for the creation of literals. ES5 clears this up by stating that literals must use built-in constructors. See https://es5.github.io/#x11.1.5 for more details.

    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;

    /** Native constructor references. */
    var Array = context.Array,
        Date = context.Date,
        Error = context.Error,
        Function = context.Function,
        Math = context.Math,
        Number = context.Number,
        Object = context.Object,
        RegExp = context.RegExp,
        String = context.String,
        TypeError = context.TypeError;

    /** Used for native method references. */
    var arrayProto = Array.prototype,
        objectProto = Object.prototype,
        stringProto = String.prototype;

    /** Used to resolve the decompiled source of functions. */
    var fnToString = Function.prototype.toString;

    /** Used to check objects for own properties. */
    var hasOwnProperty = objectProto.hasOwnProperty;

    /** Used to generate unique IDs. */
    var idCounter = 0;


Used to resolve the toStringTag of values.

    var objToString = objectProto.toString;

    /** Used to restore the original `_` reference in `_.noConflict`. */
    var oldDash = root._;

    /** Used to detect if a method is native. */
    var reIsNative = RegExp('^' +
      fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
    );

    /** Native method references. */
    var ArrayBuffer = context.ArrayBuffer,
        clearTimeout = context.clearTimeout,
        parseFloat = context.parseFloat,
        pow = Math.pow,
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
        Set = getNative(context, 'Set'),
        setTimeout = context.setTimeout,
        splice = arrayProto.splice,
        Uint8Array = context.Uint8Array,
        WeakMap = getNative(context, 'WeakMap');

    /* Native method references for those with the same name as other `lodash` methods. */
    var nativeCeil = Math.ceil,
        nativeCreate = getNative(Object, 'create'),
        nativeFloor = Math.floor,
        nativeIsArray = getNative(Array, 'isArray'),
        nativeIsFinite = context.isFinite,
        nativeKeys = getNative(Object, 'keys'),
        nativeMax = Math.max,
        nativeMin = Math.min,
        nativeNow = getNative(Date, 'now'),
        nativeParseInt = context.parseInt,
        nativeRandom = Math.random;

    /** Used as references for `-Infinity` and `Infinity`. */
    var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,
        POSITIVE_INFINITY = Number.POSITIVE_INFINITY;

    /** Used as references for the maximum length and index of an array. */
    var MAX_ARRAY_LENGTH = 4294967295,
        MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;


Used as the maximum length of an array-like value.

    var MAX_SAFE_INTEGER = 9007199254740991;

    /** Used to store function metadata. */
    var metaMap = WeakMap && new WeakMap;

    /** Used to lookup unminified function names. */
    var realNames = {};

    /*------------------------------------------------------------------------*/


Creates a lodash object which wraps value to enable implicit chaining. Methods that operate on and return arrays, collections, and functions can be chained together. Methods that retrieve a single value or may return a primitive value will automatically end the chain returning the unwrapped value. Explicit chaining may be enabled using .chain. The execution of chained methods is lazy, that is, execution is deferred until #value is implicitly or explicitly called.

Lazy evaluation allows several methods to support shortcut fusion. Shortcut fusion is an optimization strategy which merge iteratee calls; this can help to avoid the creation of intermediate data structures and greatly reduce the number of iteratee executions.

Chaining is supported in custom builds as long as the #value method is directly or indirectly included in the build.

In addition to lodash methods, wrappers have Array and String methods.

The wrapper Array methods are: concat, join, pop, push, reverse, shift, slice, sort, splice, and unshift

The wrapper String methods are: replace and split

The wrapper methods that support shortcut fusion are: compact, drop, dropRight, dropRightWhile, dropWhile, filter, first, initial, last, map, pluck, reject, rest, reverse, slice, take, takeRight, takeRightWhile, takeWhile, toArray, and where

The chainable wrapper methods are: after, ary, assign, at, before, bind, bindAll, bindKey, callback, chain, chunk, commit, compact, concat, constant, countBy, create, curry, debounce, defaults, defaultsDeep, defer, delay, difference, drop, dropRight, dropRightWhile, dropWhile, fill, filter, flatten, flattenDeep, flow, flowRight, forEach, forEachRight, forIn, forInRight, forOwn, forOwnRight, functions, groupBy, indexBy, initial, intersection, invert, invoke, keys, keysIn, map, mapKeys, mapValues, matches, matchesProperty, memoize, merge, method, methodOf, mixin, modArgs, negate, omit, once, pairs, partial, partialRight, partition, pick, plant, pluck, property, propertyOf, pull, pullAt, push, range, rearg, reject, remove, rest, restParam, reverse, set, shuffle, slice, sort, sortBy, sortByAll, sortByOrder, splice, spread, take, takeRight, takeRightWhile, takeWhile, tap, throttle, thru, times, toArray, toPlainObject, transform, union, uniq, unshift, unzip, unzipWith, values, valuesIn, where, without, wrap, xor, zip, zipObject, zipWith

The wrapper methods that are not chainable by default are: add, attempt, camelCase, capitalize, ceil, clone, cloneDeep, deburr, endsWith, escape, escapeRegExp, every, find, findIndex, findKey, findLast, findLastIndex, findLastKey, findWhere, first, floor, get, gt, gte, has, identity, includes, indexOf, inRange, isArguments, isArray, isBoolean, isDate, isElement, isEmpty, isEqual, isError, isFinite isFunction, isMatch, isNative, isNaN, isNull, isNumber, isObject, isPlainObject, isRegExp, isString, isUndefined, isTypedArray, join, kebabCase, last, lastIndexOf, lt, lte, max, min, noConflict, noop, now, pad, padLeft, padRight, parseInt, pop, random, reduce, reduceRight, repeat, result, round, runInContext, shift, size, snakeCase, some, sortedIndex, sortedLastIndex, startCase, startsWith, sum, template, trim, trimLeft, trimRight, trunc, unescape, uniqueId, value, and words

The wrapper method sample will return a wrapped value when n is provided, otherwise an unwrapped value is returned.

name
constructor
category
Chain
Params
value The value to wrap in a lodash instance.
Returns
Object Returns the new lodash wrapper instance.
example var
wrapped = _([1, 2, 3]); // returns an unwrapped value wrapped.reduce(function(total, n) { return total + n; }); // => 6 // returns a wrapped value var squares = wrapped.map(function(n) { return n n; }); .isArray(squares); // => false .isArray(squares.value()); // => true
    function lodash(value) {
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
        if (value instanceof LodashWrapper) {
          return value;
        }
        if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
          return wrapperClone(value);
        }
      }
      return new LodashWrapper(value);
    }


The function whose prototype all chaining wrappers inherit from.

private
    function baseLodash() {

No operation performed.

    }


The base constructor for creating lodash wrapper objects.

API
private
Params
value * The value to wrap.
[chainAll] boolean Enable chaining for all wrapper methods.
[actions=[]] Array Actions to peform to resolve the unwrapped value.
    function LodashWrapper(value, chainAll, actions) {
      this.__wrapped__ = value;
      this.__actions__ = actions || [];
      this.__chain__ = !!chainAll;
    }


An object environment feature flags.

static
memberOf
_
Type
Object
    var support = lodash.support = {};


By default, the template delimiters used by lodash are like those in embedded Ruby (ERB). Change the following template settings to use alternative delimiters.

static
memberOf
_
Type
Object
    lodash.templateSettings = {


Used to detect data property values to be HTML-escaped.

memberOf
_.templateSettings
Type
RegExp
      'escape': reEscape,


Used to detect code to be evaluated.

memberOf
_.templateSettings
Type
RegExp
      'evaluate': reEvaluate,


Used to detect data property values to inject.

memberOf
_.templateSettings
Type
RegExp
      'interpolate': reInterpolate,


Used to reference the data object in the template text.

memberOf
_.templateSettings
Type
string
      'variable': '',


Used to import variables into the compiled template.

memberOf
_.templateSettings
Type
Object
      'imports': {


A reference to the lodash function.

memberOf
_.templateSettings.imports
Type
Function
        '_': lodash
      }
    };

    /*------------------------------------------------------------------------*/


Creates a lazy wrapper object which wraps value to enable lazy evaluation.

API
private
Params
value * The value to wrap.
    function LazyWrapper(value) {
      this.__wrapped__ = value;
      this.__actions__ = [];
      this.__dir__ = 1;
      this.__filtered__ = false;
      this.__iteratees__ = [];
      this.__takeCount__ = POSITIVE_INFINITY;
      this.__views__ = [];
    }


Creates a clone of the lazy wrapper object.

API
private
name
clone
memberOf
LazyWrapper
Returns
Object Returns the cloned LazyWrapper object.
    function lazyClone() {
      var result = new LazyWrapper(this.__wrapped__);
      result.__actions__ = arrayCopy(this.__actions__);
      result.__dir__ = this.__dir__;
      result.__filtered__ = this.__filtered__;
      result.__iteratees__ = arrayCopy(this.__iteratees__);
      result.__takeCount__ = this.__takeCount__;
      result.__views__ = arrayCopy(this.__views__);
      return result;
    }


Reverses the direction of lazy iteration.

API
private
name
reverse
memberOf
LazyWrapper
Returns
Object Returns the new reversed LazyWrapper object.
    function lazyReverse() {
      if (this.__filtered__) {
        var result = new LazyWrapper(this);
        result.__dir__ = -1;
        result.__filtered__ = true;
      } else {
        result = this.clone();
        result.__dir__ *= -1;
      }
      return result;
    }


Extracts the unwrapped value from its lazy wrapper.

API
private
name
value
memberOf
LazyWrapper
Returns
* Returns the unwrapped value.
    function lazyValue() {
      var array = this.__wrapped__.value(),
          dir = this.__dir__,
          isArr = isArray(array),
          isRight = dir < 0,
          arrLength = isArr ? array.length : 0,
          view = getView(0, arrLength, this.__views__),
          start = view.start,
          end = view.end,
          length = end - start,
          index = isRight ? end : (start - 1),
          iteratees = this.__iteratees__,
          iterLength = iteratees.length,
          resIndex = 0,
          takeCount = nativeMin(length, this.__takeCount__);

      if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
        return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__);
      }
      var result = [];

      outer:
      while (length-- && resIndex < takeCount) {
        index += dir;

        var iterIndex = -1,
            value = array[index];

        while (++iterIndex < iterLength) {
          var data = iteratees[iterIndex],
              iteratee = data.iteratee,
              type = data.type,
              computed = iteratee(value);

          if (type == LAZY_MAP_FLAG) {
            value = computed;
          } else if (!computed) {
            if (type == LAZY_FILTER_FLAG) {
              continue outer;
            } else {
              break outer;
            }
          }
        }
        result[resIndex++] = value;
      }
      return result;
    }

    /*------------------------------------------------------------------------*/


Creates a cache object to store key/value pairs.

API
private
static
name
Cache
memberOf
_.memoize
    function MapCache() {
      this.__data__ = {};
    }


Removes key and its value from the cache.

API
private
name
delete
memberOf
_.memoize.Cache
Params
key string The key of the value to remove.
Returns
boolean Returns true if the entry was removed successfully, else false.
    function mapDelete(key) {
      return this.has(key) && delete this.__data__[key];
    }


Gets the cached value for key.

API
private
name
get
memberOf
_.memoize.Cache
Params
key string The key of the value to get.
Returns
* Returns the cached value.
    function mapGet(key) {
      return key == '__proto__' ? undefined : this.__data__[key];
    }


Checks if a cached value for key exists.

API
private
name
has
memberOf
_.memoize.Cache
Params
key string The key of the entry to check.
Returns
boolean Returns true if an entry for key exists, else false.
    function mapHas(key) {
      return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
    }


Sets value to key of the cache.

API
private
name
set
memberOf
_.memoize.Cache
Params
key string The key of the value to cache.
value * The value to cache.
Returns
Object Returns the cache object.
    function mapSet(key, value) {
      if (key != '__proto__') {
        this.__data__[key] = value;
      }
      return this;
    }

    /*------------------------------------------------------------------------*/


Creates a cache object to store unique values.

API
private
Params
[values] Array The values to cache.
    function SetCache(values) {
      var length = values ? values.length : 0;

      this.data = { 'hash': nativeCreate(null), 'set': new Set };
      while (length--) {
        this.push(values[length]);
      }
    }


Checks if value is in cache mimicking the return signature of _.indexOf by returning 0 if the value is found, else -1.

API
private
Params
cache Object The cache to search.
value * The value to search for.
Returns
number Returns 0 if value is found, else -1.
    function cacheIndexOf(cache, value) {
      var data = cache.data,
          result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];

      return result ? 0 : -1;
    }


Adds value to the cache.

API
private
name
push
memberOf
SetCache
Params
value * The value to cache.
    function cachePush(value) {
      var data = this.data;
      if (typeof value == 'string' || isObject(value)) {
        data.set.add(value);
      } else {
        data.hash[value] = true;
      }
    }

    /*------------------------------------------------------------------------*/


Creates a new array joining array with other.

API
private
Params
array Array The array to join.
other Array The other array to join.
Returns
Array Returns the new concatenated array.
    function arrayConcat(array, other) {
      var index = -1,
          length = array.length,
          othIndex = -1,
          othLength = other.length,
          result = Array(length + othLength);

      while (++index < length) {
        result[index] = array[index];
      }
      while (++othIndex < othLength) {
        result[index++] = other[othIndex];
      }
      return result;
    }


Copies the values of source to array.

API
private
Params
source Array The array to copy values from.
[array=[]] Array The array to copy values to.
Returns
Array Returns array.
    function arrayCopy(source, array) {
      var index = -1,
          length = source.length;

      array || (array = Array(length));
      while (++index < length) {
        array[index] = source[index];
      }
      return array;
    }


A specialized version of _.forEach for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Returns array.
    function arrayEach(array, iteratee) {
      var index = -1,
          length = array.length;

      while (++index < length) {
        if (iteratee(array[index], index, array) === false) {
          break;
        }
      }
      return array;
    }


A specialized version of _.forEachRight for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Returns array.
    function arrayEachRight(array, iteratee) {
      var length = array.length;

      while (length--) {
        if (iteratee(array[length], length, array) === false) {
          break;
        }
      }
      return array;
    }


A specialized version of _.every for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
predicate Function The function invoked per iteration.
Returns
boolean Returns true if all elements pass the predicate check, else false.
    function arrayEvery(array, predicate) {
      var index = -1,
          length = array.length;

      while (++index < length) {
        if (!predicate(array[index], index, array)) {
          return false;
        }
      }
      return true;
    }


A specialized version of baseExtremum for arrays which invokes iteratee with one argument: (value).

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
comparator Function The function used to compare values.
exValue The initial extremum value.
Returns
Returns the extremum value.
    function arrayExtremum(array, iteratee, comparator, exValue) {
      var index = -1,
          length = array.length,
          computed = exValue,
          result = computed;

      while (++index < length) {
        var value = array[index],
            current = +iteratee(value);

        if (comparator(current, computed)) {
          computed = current;
          result = value;
        }
      }
      return result;
    }


A specialized version of _.filter for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
predicate Function The function invoked per iteration.
Returns
Array Returns the new filtered array.
    function arrayFilter(array, predicate) {
      var index = -1,
          length = array.length,
          resIndex = -1,
          result = [];

      while (++index < length) {
        var value = array[index];
        if (predicate(value, index, array)) {
          result[++resIndex] = value;
        }
      }
      return result;
    }


A specialized version of _.map for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Returns the new mapped array.
    function arrayMap(array, iteratee) {
      var index = -1,
          length = array.length,
          result = Array(length);

      while (++index < length) {
        result[index] = iteratee(array[index], index, array);
      }
      return result;
    }


Appends the elements of values to array.

API
private
Params
array Array The array to modify.
values Array The values to append.
Returns
Array Returns array.
    function arrayPush(array, values) {
      var index = -1,
          length = values.length,
          offset = array.length;

      while (++index < length) {
        array[offset + index] = values[index];
      }
      return array;
    }


A specialized version of _.reduce for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
[accumulator] The initial value.
[initFromArray] boolean Specify using the first element of array as the initial value.
Returns
Returns the accumulated value.
    function arrayReduce(array, iteratee, accumulator, initFromArray) {
      var index = -1,
          length = array.length;

      if (initFromArray && length) {
        accumulator = array[++index];
      }
      while (++index < length) {
        accumulator = iteratee(accumulator, array[index], index, array);
      }
      return accumulator;
    }


A specialized version of _.reduceRight for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
[accumulator] The initial value.
[initFromArray] boolean Specify using the last element of array as the initial value.
Returns
Returns the accumulated value.
    function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
      var length = array.length;
      if (initFromArray && length) {
        accumulator = array[--length];
      }
      while (length--) {
        accumulator = iteratee(accumulator, array[length], length, array);
      }
      return accumulator;
    }


A specialized version of _.some for arrays without support for callback shorthands and this binding.

API
private
Params
array Array The array to iterate over.
predicate Function The function invoked per iteration.
Returns
boolean Returns true if any element passes the predicate check, else false.
    function arraySome(array, predicate) {
      var index = -1,
          length = array.length;

      while (++index < length) {
        if (predicate(array[index], index, array)) {
          return true;
        }
      }
      return false;
    }


A specialized version of _.sum for arrays without support for callback shorthands and this binding..

API
private
Params
array Array The array to iterate over.
iteratee Function The function invoked per iteration.
Returns
number Returns the sum.
    function arraySum(array, iteratee) {
      var length = array.length,
          result = 0;

      while (length--) {
        result += +iteratee(array[length]) || 0;
      }
      return result;
    }


Used by .defaults to customize its .assign use.

API
private
Params
objectValue The destination object property value.
sourceValue The source object property value.
Returns
* Returns the value to assign to the destination object.
    function assignDefaults(objectValue, sourceValue) {
      return objectValue === undefined ? sourceValue : objectValue;
    }


Used by .template to customize its .assign use.

Note: This function is like assignDefaults except that it ignores inherited property values when checking if a property is undefined.

API
private
Params
objectValue The destination object property value.
sourceValue The source object property value.
key string The key associated with the object and source values.
object Object The destination object.
Returns
* Returns the value to assign to the destination object.
    function assignOwnDefaults(objectValue, sourceValue, key, object) {
      return (objectValue === undefined || !hasOwnProperty.call(object, key))
        ? sourceValue
        : objectValue;
    }


A specialized version of _.assign for customizing assigned values without support for argument juggling, multiple sources, and this binding customizer functions.

API
private
Params
object Object The destination object.
source Object The source object.
customizer Function The function to customize assigned values.
Returns
Object Returns object.
    function assignWith(object, source, customizer) {
      var index = -1,
          props = keys(source),
          length = props.length;

      while (++index < length) {
        var key = props[index],
            value = object[key],
            result = customizer(value, source[key], key, object, source);

        if ((result === result ? (result !== value) : (value === value)) ||
            (value === undefined && !(key in object))) {
          object[key] = result;
        }
      }
      return object;
    }


The base implementation of _.assign without support for argument juggling, multiple sources, and customizer functions.

API
private
Params
object Object The destination object.
source Object The source object.
Returns
Object Returns object.
    function baseAssign(object, source) {
      return source == null
        ? object
        : baseCopy(source, keys(source), object);
    }


The base implementation of _.at without support for string collections and individual key arguments.

API
private
Params
collection Array Object The collection to iterate over.
props number[] string[] The property names or indexes of elements to pick.
Returns
Array Returns the new array of picked elements.
    function baseAt(collection, props) {
      var index = -1,
          isNil = collection == null,
          isArr = !isNil && isArrayLike(collection),
          length = isArr ? collection.length : 0,
          propsLength = props.length,
          result = Array(propsLength);

      while(++index < propsLength) {
        var key = props[index];
        if (isArr) {
          result[index] = isIndex(key, length) ? collection[key] : undefined;
        } else {
          result[index] = isNil ? undefined : collection[key];
        }
      }
      return result;
    }


Copies properties of source to object.

API
private
Params
source Object The object to copy properties from.
props Array The property names to copy.
[object={}] Object The object to copy properties to.
Returns
Object Returns object.
    function baseCopy(source, props, object) {
      object || (object = {});

      var index = -1,
          length = props.length;

      while (++index < length) {
        var key = props[index];
        object[key] = source[key];
      }
      return object;
    }


The base implementation of .callback which supports specifying the number of arguments to provide to func.

API
private
Params
[func=.identity] The value to convert to a callback.
[thisArg] The this binding of func.
[argCount] number The number of arguments to provide to func.
Returns
Function Returns the callback.
    function baseCallback(func, thisArg, argCount) {
      var type = typeof func;
      if (type == 'function') {
        return thisArg === undefined
          ? func
          : bindCallback(func, thisArg, argCount);
      }
      if (func == null) {
        return identity;
      }
      if (type == 'object') {
        return baseMatches(func);
      }
      return thisArg === undefined
        ? property(func)
        : baseMatchesProperty(func, thisArg);
    }


The base implementation of _.clone without support for argument juggling and this binding customizer functions.

API
private
Params
value The value to clone.
[isDeep] boolean Specify a deep clone.
[customizer] Function The function to customize cloning values.
[key] string The key of value.
[object] Object The object value belongs to.
[stackA=[]] Array Tracks traversed source objects.
[stackB=[]] Array Associates clones with source counterparts.
Returns
Returns the cloned value.
    function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
      var result;
      if (customizer) {
        result = object ? customizer(value, key, object) : customizer(value);
      }
      if (result !== undefined) {
        return result;
      }
      if (!isObject(value)) {
        return value;
      }
      var isArr = isArray(value);
      if (isArr) {
        result = initCloneArray(value);
        if (!isDeep) {
          return arrayCopy(value, result);
        }
      } else {
        var tag = objToString.call(value),
            isFunc = tag == funcTag;

        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
          result = initCloneObject(isFunc ? {} : value);
          if (!isDeep) {
            return baseAssign(result, value);
          }
        } else {
          return cloneableTags[tag]
            ? initCloneByTag(value, tag, isDeep)
            : (object ? value : {});
        }
      }

Check for circular references and return its corresponding clone.

      stackA || (stackA = []);
      stackB || (stackB = []);

      var length = stackA.length;
      while (length--) {
        if (stackA[length] == value) {
          return stackB[length];
        }
      }

Add the source value to the stack of traversed objects and associate it with its clone.

      stackA.push(value);
      stackB.push(result);


Recursively populate clone (susceptible to call stack limits).

      (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
        result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
      });
      return result;
    }


The base implementation of _.create without support for assigning properties to the created object.

API
private
Params
prototype Object The object to inherit from.
Returns
Object Returns the new object.
    var baseCreate = (function() {
      function object() {}
      return function(prototype) {
        if (isObject(prototype)) {
          object.prototype = prototype;
          var result = new object;
          object.prototype = undefined;
        }
        return result || {};
      };
    }());


The base implementation of .delay and .defer which accepts an index of where to slice the arguments to provide to func.

API
private
Params
func Function The function to delay.
wait number The number of milliseconds to delay invocation.
args Object The arguments provide to func.
Returns
number Returns the timer id.
    function baseDelay(func, wait, args) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return setTimeout(function() { func.apply(undefined, args); }, wait);
    }


The base implementation of _.difference which accepts a single array of values to exclude.

API
private
Params
array Array The array to inspect.
values Array The values to exclude.
Returns
Array Returns the new array of filtered values.
    function baseDifference(array, values) {
      var length = array ? array.length : 0,
          result = [];

      if (!length) {
        return result;
      }
      var index = -1,
          indexOf = getIndexOf(),
          isCommon = indexOf == baseIndexOf,
          cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
          valuesLength = values.length;

      if (cache) {
        indexOf = cacheIndexOf;
        isCommon = false;
        values = cache;
      }
      outer:
      while (++index < length) {
        var value = array[index];

        if (isCommon && value === value) {
          var valuesIndex = valuesLength;
          while (valuesIndex--) {
            if (values[valuesIndex] === value) {
              continue outer;
            }
          }
          result.push(value);
        }
        else if (indexOf(values, value, 0) < 0) {
          result.push(value);
        }
      }
      return result;
    }


The base implementation of _.forEach without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Object string Returns collection.
    var baseEach = createBaseEach(baseForOwn);


The base implementation of _.forEachRight without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Object string Returns collection.
    var baseEachRight = createBaseEach(baseForOwnRight, true);


The base implementation of _.every without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
predicate Function The function invoked per iteration.
Returns
boolean Returns true if all elements pass the predicate check, else false
    function baseEvery(collection, predicate) {
      var result = true;
      baseEach(collection, function(value, index, collection) {
        result = !!predicate(value, index, collection);
        return result;
      });
      return result;
    }


Gets the extremum value of collection invoking iteratee for each value in collection to generate the criterion by which the value is ranked. The iteratee is invoked with three arguments: (value, index|key, collection).

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
comparator Function The function used to compare values.
exValue The initial extremum value.
Returns
Returns the extremum value.
    function baseExtremum(collection, iteratee, comparator, exValue) {
      var computed = exValue,
          result = computed;

      baseEach(collection, function(value, index, collection) {
        var current = +iteratee(value, index, collection);
        if (comparator(current, computed) || (current === exValue && current === result)) {
          computed = current;
          result = value;
        }
      });
      return result;
    }


The base implementation of _.fill without an iteratee call guard.

API
private
Params
array Array The array to fill.
value * The value to fill array with.
[start=0] number The start position.
[end=array.length] number The end position.
Returns
Array Returns array.
    function baseFill(array, value, start, end) {
      var length = array.length;

      start = start == null ? 0 : (+start || 0);
      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = (end === undefined || end > length) ? length : (+end || 0);
      if (end < 0) {
        end += length;
      }
      length = start > end ? 0 : (end >>> 0);
      start >>>= 0;

      while (start < length) {
        array[start++] = value;
      }
      return array;
    }


The base implementation of _.filter without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
predicate Function The function invoked per iteration.
Returns
Array Returns the new filtered array.
    function baseFilter(collection, predicate) {
      var result = [];
      baseEach(collection, function(value, index, collection) {
        if (predicate(value, index, collection)) {
          result.push(value);
        }
      });
      return result;
    }


The base implementation of .find, .findLast, .findKey, and .findLastKey, without support for callback shorthands and this binding, which iterates over collection using the provided eachFunc.

API
private
Params
collection Array Object string The collection to search.
predicate Function The function invoked per iteration.
eachFunc Function The function to iterate over collection.
[retKey] boolean Specify returning the key of the found element instead of the element itself.
Returns
* Returns the found element or its key, else undefined.
    function baseFind(collection, predicate, eachFunc, retKey) {
      var result;
      eachFunc(collection, function(value, key, collection) {
        if (predicate(value, key, collection)) {
          result = retKey ? key : value;
          return false;
        }
      });
      return result;
    }


The base implementation of _.flatten with added support for restricting flattening and specifying the start index.

API
private
Params
array Array The array to flatten.
[isDeep] boolean Specify a deep flatten.
[isStrict] boolean Restrict flattening to arrays-like objects.
[result=[]] Array The initial result value.
Returns
Array Returns the new flattened array.
    function baseFlatten(array, isDeep, isStrict, result) {
      result || (result = []);

      var index = -1,
          length = array.length;

      while (++index < length) {
        var value = array[index];
        if (isObjectLike(value) && isArrayLike(value) &&
            (isStrict || isArray(value) || isArguments(value))) {
          if (isDeep) {

Recursively flatten arrays (susceptible to call stack limits).

            baseFlatten(value, isDeep, isStrict, result);
          } else {
            arrayPush(result, value);
          }
        } else if (!isStrict) {
          result[result.length] = value;
        }
      }
      return result;
    }


The base implementation of baseForIn and baseForOwn which iterates over object properties returned by keysFunc invoking iteratee for each property. Iteratee functions may exit iteration early by explicitly returning false.

API
private
Params
object Object The object to iterate over.
iteratee Function The function invoked per iteration.
keysFunc Function The function to get the keys of object.
Returns
Object Returns object.
    var baseFor = createBaseFor();


This function is like baseFor except that it iterates over properties in the opposite order.

API
private
Params
object Object The object to iterate over.
iteratee Function The function invoked per iteration.
keysFunc Function The function to get the keys of object.
Returns
Object Returns object.
    var baseForRight = createBaseFor(true);


The base implementation of _.forIn without support for callback shorthands and this binding.

API
private
Params
object Object The object to iterate over.
iteratee Function The function invoked per iteration.
Returns
Object Returns object.
    function baseForIn(object, iteratee) {
      return baseFor(object, iteratee, keysIn);
    }


The base implementation of _.forOwn without support for callback shorthands and this binding.

API
private
Params
object Object The object to iterate over.
iteratee Function The function invoked per iteration.
Returns
Object Returns object.
    function baseForOwn(object, iteratee) {
      return baseFor(object, iteratee, keys);
    }


The base implementation of _.forOwnRight without support for callback shorthands and this binding.

API
private
Params
object Object The object to iterate over.
iteratee Function The function invoked per iteration.
Returns
Object Returns object.
    function baseForOwnRight(object, iteratee) {
      return baseForRight(object, iteratee, keys);
    }


The base implementation of _.functions which creates an array of object function property names filtered from those provided.

API
private
Params
object Object The object to inspect.
props Array The property names to filter.
Returns
Array Returns the new array of filtered property names.
    function baseFunctions(object, props) {
      var index = -1,
          length = props.length,
          resIndex = -1,
          result = [];

      while (++index < length) {
        var key = props[index];
        if (isFunction(object[key])) {
          result[++resIndex] = key;
        }
      }
      return result;
    }


The base implementation of get without support for string paths and default values.

API
private
Params
object Object The object to query.
path Array The path of the property to get.
[pathKey] string The key representation of path.
Returns
* Returns the resolved value.
    function baseGet(object, path, pathKey) {
      if (object == null) {
        return;
      }
      if (pathKey !== undefined && pathKey in toObject(object)) {
        path = [pathKey];
      }
      var index = 0,
          length = path.length;

      while (object != null && index < length) {
        object = object[path[index++]];
      }
      return (index && index == length) ? object : undefined;
    }


The base implementation of _.isEqual without support for this binding customizer functions.

API
private
Params
value The value to compare.
other The other value to compare.
[customizer] Function The function to customize comparing values.
[isLoose] boolean Specify performing partial comparisons.
[stackA] Array Tracks traversed value objects.
[stackB] Array Tracks traversed other objects.
Returns
boolean Returns true if the values are equivalent, else false.
    function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
      if (value === other) {
        return true;
      }
      if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
        return value !== value && other !== other;
      }
      return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
    }


A specialized version of baseIsEqual for arrays and objects which performs deep comparisons and tracks traversed objects enabling objects with circular references to be compared.

API
private
Params
object Object The object to compare.
other Object The other object to compare.
equalFunc Function The function to determine equivalents of values.
[customizer] Function The function to customize comparing objects.
[isLoose] boolean Specify performing partial comparisons.
[stackA=[]] Array Tracks traversed value objects.
[stackB=[]] Array Tracks traversed other objects.
Returns
boolean Returns true if the objects are equivalent, else false.
    function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
      var objIsArr = isArray(object),
          othIsArr = isArray(other),
          objTag = arrayTag,
          othTag = arrayTag;

      if (!objIsArr) {
        objTag = objToString.call(object);
        if (objTag == argsTag) {
          objTag = objectTag;
        } else if (objTag != objectTag) {
          objIsArr = isTypedArray(object);
        }
      }
      if (!othIsArr) {
        othTag = objToString.call(other);
        if (othTag == argsTag) {
          othTag = objectTag;
        } else if (othTag != objectTag) {
          othIsArr = isTypedArray(other);
        }
      }
      var objIsObj = objTag == objectTag,
          othIsObj = othTag == objectTag,
          isSameTag = objTag == othTag;

      if (isSameTag && !(objIsArr || objIsObj)) {
        return equalByTag(object, other, objTag);
      }
      if (!isLoose) {
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

        if (objIsWrapped || othIsWrapped) {
          return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
        }
      }
      if (!isSameTag) {
        return false;
      }

Assume cyclic values are equal. For more information on detecting circular references see https://es5.github.io/#JO.

      stackA || (stackA = []);
      stackB || (stackB = []);

      var length = stackA.length;
      while (length--) {
        if (stackA[length] == object) {
          return stackB[length] == other;
        }
      }

Add object and other to the stack of traversed objects.

      stackA.push(object);
      stackB.push(other);

      var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);

      stackA.pop();
      stackB.pop();

      return result;
    }


The base implementation of _.isMatch without support for callback shorthands and this binding.

API
private
Params
object Object The object to inspect.
matchData Array The propery names, values, and compare flags to match.
[customizer] Function The function to customize comparing objects.
Returns
boolean Returns true if object is a match, else false.
    function baseIsMatch(object, matchData, customizer) {
      var index = matchData.length,
          length = index,
          noCustomizer = !customizer;

      if (object == null) {
        return !length;
      }
      object = toObject(object);
      while (index--) {
        var data = matchData[index];
        if ((noCustomizer && data[2])
              ? data[1] !== object[data[0]]
              : !(data[0] in object)
            ) {
          return false;
        }
      }
      while (++index < length) {
        data = matchData[index];
        var key = data[0],
            objValue = object[key],
            srcValue = data[1];

        if (noCustomizer && data[2]) {
          if (objValue === undefined && !(key in object)) {
            return false;
          }
        } else {
          var result = customizer ? customizer(objValue, srcValue, key) : undefined;
          if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
            return false;
          }
        }
      }
      return true;
    }


The base implementation of _.map without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
Returns
Array Returns the new mapped array.
    function baseMap(collection, iteratee) {
      var index = -1,
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value, key, collection) {
        result[++index] = iteratee(value, key, collection);
      });
      return result;
    }


The base implementation of _.matches which does not clone source.

API
private
Params
source Object The object of property values to match.
Returns
Function Returns the new function.
    function baseMatches(source) {
      var matchData = getMatchData(source);
      if (matchData.length == 1 && matchData[0][2]) {
        var key = matchData[0][0],
            value = matchData[0][1];

        return function(object) {
          if (object == null) {
            return false;
          }
          return object[key] === value && (value !== undefined || (key in toObject(object)));
        };
      }
      return function(object) {
        return baseIsMatch(object, matchData);
      };
    }


The base implementation of _.matchesProperty which does not clone srcValue.

API
private
Params
path string The path of the property to get.
srcValue * The value to compare.
Returns
Function Returns the new function.
    function baseMatchesProperty(path, srcValue) {
      var isArr = isArray(path),
          isCommon = isKey(path) && isStrictComparable(srcValue),
          pathKey = (path + '');

      path = toPath(path);
      return function(object) {
        if (object == null) {
          return false;
        }
        var key = pathKey;
        object = toObject(object);
        if ((isArr || !isCommon) && !(key in object)) {
          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
          if (object == null) {
            return false;
          }
          key = last(path);
          object = toObject(object);
        }
        return object[key] === srcValue
          ? (srcValue !== undefined || (key in object))
          : baseIsEqual(srcValue, object[key], undefined, true);
      };
    }


The base implementation of _.merge without support for argument juggling, multiple sources, and this binding customizer functions.

API
private
Params
object Object The destination object.
source Object The source object.
[customizer] Function The function to customize merged values.
[stackA=[]] Array Tracks traversed source objects.
[stackB=[]] Array Associates values with source counterparts.
Returns
Object Returns object.
    function baseMerge(object, source, customizer, stackA, stackB) {
      if (!isObject(object)) {
        return object;
      }
      var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
          props = isSrcArr ? undefined : keys(source);

      arrayEach(props || source, function(srcValue, key) {
        if (props) {
          key = srcValue;
          srcValue = source[key];
        }
        if (isObjectLike(srcValue)) {
          stackA || (stackA = []);
          stackB || (stackB = []);
          baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
        }
        else {
          var value = object[key],
              result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
              isCommon = result === undefined;

          if (isCommon) {
            result = srcValue;
          }
          if ((result !== undefined || (isSrcArr && !(key in object))) &&
              (isCommon || (result === result ? (result !== value) : (value === value)))) {
            object[key] = result;
          }
        }
      });
      return object;
    }


A specialized version of baseMerge for arrays and objects which performs deep merges and tracks traversed objects enabling objects with circular references to be merged.

API
private
Params
object Object The destination object.
source Object The source object.
key string The key of the value to merge.
mergeFunc Function The function to merge values.
[customizer] Function The function to customize merged values.
[stackA=[]] Array Tracks traversed source objects.
[stackB=[]] Array Associates values with source counterparts.
Returns
boolean Returns true if the objects are equivalent, else false.
    function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
      var length = stackA.length,
          srcValue = source[key];

      while (length--) {
        if (stackA[length] == srcValue) {
          object[key] = stackB[length];
          return;
        }
      }
      var value = object[key],
          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
          isCommon = result === undefined;

      if (isCommon) {
        result = srcValue;
        if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
          result = isArray(value)
            ? value
            : (isArrayLike(value) ? arrayCopy(value) : []);
        }
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
          result = isArguments(value)
            ? toPlainObject(value)
            : (isPlainObject(value) ? value : {});
        }
        else {
          isCommon = false;
        }
      }

Add the source value to the stack of traversed objects and associate it with its merged value.

      stackA.push(srcValue);
      stackB.push(result);

      if (isCommon) {

Recursively merge objects and arrays (susceptible to call stack limits).

        object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
      } else if (result === result ? (result !== value) : (value === value)) {
        object[key] = result;
      }
    }


The base implementation of _.property without support for deep paths.

API
private
Params
key string The key of the property to get.
Returns
Function Returns the new function.
    function baseProperty(key) {
      return function(object) {
        return object == null ? undefined : object[key];
      };
    }


A specialized version of baseProperty which supports deep paths.

API
private
Params
path Array string The path of the property to get.
Returns
Function Returns the new function.
    function basePropertyDeep(path) {
      var pathKey = (path + '');
      path = toPath(path);
      return function(object) {
        return baseGet(object, path, pathKey);
      };
    }


The base implementation of _.pullAt without support for individual index arguments and capturing the removed elements.

API
private
Params
array Array The array to modify.
indexes number[] The indexes of elements to remove.
Returns
Array Returns array.
    function basePullAt(array, indexes) {
      var length = array ? indexes.length : 0;
      while (length--) {
        var index = indexes[length];
        if (index != previous && isIndex(index)) {
          var previous = index;
          splice.call(array, index, 1);
        }
      }
      return array;
    }


The base implementation of _.random without support for argument juggling and returning floating-point numbers.

API
private
Params
min number The minimum possible value.
max number The maximum possible value.
Returns
number Returns the random number.
    function baseRandom(min, max) {
      return min + nativeFloor(nativeRandom() * (max - min + 1));
    }


The base implementation of .reduce and .reduceRight without support for callback shorthands and this binding, which iterates over collection using the provided eachFunc.

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
accumulator The initial value.
initFromCollection boolean Specify using the first or last element of collection as the initial value.
eachFunc Function The function to iterate over collection.
Returns
Returns the accumulated value.
    function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
      eachFunc(collection, function(value, index, collection) {
        accumulator = initFromCollection
          ? (initFromCollection = false, value)
          : iteratee(accumulator, value, index, collection);
      });
      return accumulator;
    }


The base implementation of setData without support for hot loop detection.

API
private
Params
func Function The function to associate metadata with.
data * The metadata.
Returns
Function Returns func.
    var baseSetData = !metaMap ? identity : function(func, data) {
      metaMap.set(func, data);
      return func;
    };


The base implementation of _.slice without an iteratee call guard.

API
private
Params
array Array The array to slice.
[start=0] number The start position.
[end=array.length] number The end position.
Returns
Array Returns the slice of array.
    function baseSlice(array, start, end) {
      var index = -1,
          length = array.length;

      start = start == null ? 0 : (+start || 0);
      if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }
      end = (end === undefined || end > length) ? length : (+end || 0);
      if (end < 0) {
        end += length;
      }
      length = start > end ? 0 : ((end - start) >>> 0);
      start >>>= 0;

      var result = Array(length);
      while (++index < length) {
        result[index] = array[index + start];
      }
      return result;
    }


The base implementation of _.some without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
predicate Function The function invoked per iteration.
Returns
boolean Returns true if any element passes the predicate check, else false.
    function baseSome(collection, predicate) {
      var result;

      baseEach(collection, function(value, index, collection) {
        result = predicate(value, index, collection);
        return !result;
      });
      return !!result;
    }


The base implementation of _.sortBy which uses comparer to define the sort order of array and replaces criteria objects with their corresponding values.

API
private
Params
array Array The array to sort.
comparer Function The function to define sort order.
Returns
Array Returns array.
    function baseSortBy(array, comparer) {
      var length = array.length;

      array.sort(comparer);
      while (length--) {
        array[length] = array[length].value;
      }
      return array;
    }


The base implementation of _.sortByOrder without param guards.

API
private
Params
collection Array Object string The collection to iterate over.
iteratees Function[] Object[] string[] The iteratees to sort by.
orders boolean[] The sort orders of iteratees.
Returns
Array Returns the new sorted array.
    function baseSortByOrder(collection, iteratees, orders) {
      var callback = getCallback(),
          index = -1;

      iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });

      var result = baseMap(collection, function(value) {
        var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
        return { 'criteria': criteria, 'index': ++index, 'value': value };
      });

      return baseSortBy(result, function(object, other) {
        return compareMultiple(object, other, orders);
      });
    }


The base implementation of _.sum without support for callback shorthands and this binding.

API
private
Params
collection Array Object string The collection to iterate over.
iteratee Function The function invoked per iteration.
Returns
number Returns the sum.
    function baseSum(collection, iteratee) {
      var result = 0;
      baseEach(collection, function(value, index, collection) {
        result += +iteratee(value, index, collection) || 0;
      });
      return result;
    }


The base implementation of _.uniq without support for callback shorthands and this binding.

API
private
Params
array Array The array to inspect.
[iteratee] Function The function invoked per iteration.
Returns
Array Returns the new duplicate-value-free array.
    function baseUniq(array, iteratee) {
      var index = -1,
          indexOf = getIndexOf(),
          length = array.length,
          isCommon = indexOf == baseIndexOf,
          isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
          seen = isLarge ? createCache() : null,
          result = [];

      if (seen) {
        indexOf = cacheIndexOf;
        isCommon = false;
      } else {
        isLarge = false;
        seen = iteratee ? [] : result;
      }
      outer:
      while (++index < length) {
        var value = array[index],
            computed = iteratee ? iteratee(value, index, array) : value;

        if (isCommon && value === value) {
          var seenIndex = seen.length;
          while (seenIndex--) {
            if (seen[seenIndex] === computed) {
              continue outer;
            }
          }
          if (iteratee) {
            seen.push(computed);
          }
          result.push(value);
        }
        else if (indexOf(seen, computed, 0) < 0) {
          if (iteratee || isLarge) {
            seen.push(computed);
          }
          result.push(value);
        }
      }
      return result;
    }


The base implementation of .values and .valuesIn which creates an array of object property values corresponding to the property names of props.

API
private
Params
object Object The object to query.
props Array The property names to get values for.
Returns
Object Returns the array of property values.
    function baseValues(object, props) {
      var index = -1,
          length = props.length,
          result = Array(length);

      while (++index < length) {
        result[index] = object[props[index]];
      }
      return result;
    }


The base implementation of .dropRightWhile, .dropWhile, .takeRightWhile, and .takeWhile without support for callback shorthands and this binding.

API
private
Params
array Array The array to query.
predicate Function The function invoked per iteration.
[isDrop] boolean Specify dropping elements instead of taking them.
[fromRight] boolean Specify iterating from right to left.
Returns
Array Returns the slice of array.
    function baseWhile(array, predicate, isDrop, fromRight) {
      var length = array.length,
          index = fromRight ? length : -1;

      while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
      return isDrop
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
    }


The base implementation of wrapperValue which returns the result of performing a sequence of actions on the unwrapped value, where each successive action is supplied the return value of the previous.

API
private
Params
value The unwrapped value.
actions Array Actions to peform to resolve the unwrapped value.
Returns
Returns the resolved value.
    function baseWrapperValue(value, actions) {
      var result = value;
      if (result instanceof LazyWrapper) {
        result = result.value();
      }
      var index = -1,
          length = actions.length;

      while (++index < length) {
        var action = actions[index];
        result = action.func.apply(action.thisArg, arrayPush([result], action.args));
      }
      return result;
    }


Performs a binary search of array to determine the index at which value should be inserted into array in order to maintain its sort order.

API
private
Params
array Array The sorted array to inspect.
value * The value to evaluate.
[retHighest] boolean Specify returning the highest qualified index.
Returns
number Returns the index at which value should be inserted into array.
    function binaryIndex(array, value, retHighest) {
      var low = 0,
          high = array ? array.length : low;

      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
        while (low < high) {
          var mid = (low + high) >>> 1,
              computed = array[mid];

          if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
            low = mid + 1;
          } else {
            high = mid;
          }
        }
        return high;
      }
      return binaryIndexBy(array, value, identity, retHighest);
    }


This function is like binaryIndex except that it invokes iteratee for value and each element of array to compute their sort ranking. The iteratee is invoked with one argument; (value).

API
private
Params
array Array The sorted array to inspect.
value * The value to evaluate.
iteratee Function The function invoked per iteration.
[retHighest] boolean Specify returning the highest qualified index.
Returns
number Returns the index at which value should be inserted into array.
    function binaryIndexBy(array, value, iteratee, retHighest) {
      value = iteratee(value);

      var low = 0,
          high = array ? array.length : 0,
          valIsNaN = value !== value,
          valIsNull = value === null,
          valIsUndef = value === undefined;

      while (low < high) {
        var mid = nativeFloor((low + high) / 2),
            computed = iteratee(array[mid]),
            isDef = computed !== undefined,
            isReflexive = computed === computed;

        if (valIsNaN) {
          var setLow = isReflexive || retHighest;
        } else if (valIsNull) {
          setLow = isReflexive && isDef && (retHighest || computed != null);
        } else if (valIsUndef) {
          setLow = isReflexive && (retHighest || isDef);
        } else if (computed == null) {
          setLow = false;
        } else {
          setLow = retHighest ? (computed <= value) : (computed < value);
        }
        if (setLow) {
          low = mid + 1;
        } else {
          high = mid;
        }
      }
      return nativeMin(high, MAX_ARRAY_INDEX);
    }


A specialized version of baseCallback which only supports this binding and specifying the number of arguments to provide to func.

API
private
Params
func Function The function to bind.
thisArg * The this binding of func.
[argCount] number The number of arguments to provide to func.
Returns
Function Returns the callback.
    function bindCallback(func, thisArg, argCount) {
      if (typeof func != 'function') {
        return identity;
      }
      if (thisArg === undefined) {
        return func;
      }
      switch (argCount) {
        case 1: return function(value) {
          return func.call(thisArg, value);
        };
        case 3: return function(value, index, collection) {
          return func.call(thisArg, value, index, collection);
        };
        case 4: return function(accumulator, value, index, collection) {
          return func.call(thisArg, accumulator, value, index, collection);
        };
        case 5: return function(value, other, key, object, source) {
          return func.call(thisArg, value, other, key, object, source);
        };
      }
      return function() {
        return func.apply(thisArg, arguments);
      };
    }


Creates a clone of the given array buffer.

API
private
Params
buffer ArrayBuffer The array buffer to clone.
Returns
ArrayBuffer Returns the cloned array buffer.
    function bufferClone(buffer) {
      var result = new ArrayBuffer(buffer.byteLength),
          view = new Uint8Array(result);

      view.set(new Uint8Array(buffer));
      return result;
    }


Creates an array that is the composition of partially applied arguments, placeholders, and provided arguments into a single array of arguments.

API
private
Params
args Array Object The provided arguments.
partials Array The arguments to prepend to those provided.
holders Array The partials placeholder indexes.
Returns
Array Returns the new array of composed arguments.
    function composeArgs(args, partials, holders) {
      var holdersLength = holders.length,
          argsIndex = -1,
          argsLength = nativeMax(args.length - holdersLength, 0),
          leftIndex = -1,
          leftLength = partials.length,
          result = Array(leftLength + argsLength);

      while (++leftIndex < leftLength) {
        result[leftIndex] = partials[leftIndex];
      }
      while (++argsIndex < holdersLength) {
        result[holders[argsIndex]] = args[argsIndex];
      }
      while (argsLength--) {
        result[leftIndex++] = args[argsIndex++];
      }
      return result;
    }


This function is like composeArgs except that the arguments composition is tailored for _.partialRight.

API
private
Params
args Array Object The provided arguments.
partials Array The arguments to append to those provided.
holders Array The partials placeholder indexes.
Returns
Array Returns the new array of composed arguments.
    function composeArgsRight(args, partials, holders) {
      var holdersIndex = -1,
          holdersLength = holders.length,
          argsIndex = -1,
          argsLength = nativeMax(args.length - holdersLength, 0),
          rightIndex = -1,
          rightLength = partials.length,
          result = Array(argsLength + rightLength);

      while (++argsIndex < argsLength) {
        result[argsIndex] = args[argsIndex];
      }
      var offset = argsIndex;
      while (++rightIndex < rightLength) {
        result[offset + rightIndex] = partials[rightIndex];
      }
      while (++holdersIndex < holdersLength) {
        result[offset + holders[holdersIndex]] = args[argsIndex++];
      }
      return result;
    }


Creates a .countBy, .groupBy, .indexBy, or .partition function.

API
private
Params
setter Function The function to set keys and values of the accumulator object.
[initializer] Function The function to initialize the accumulator object.
Returns
Function Returns the new aggregator function.
    function createAggregator(setter, initializer) {
      return function(collection, iteratee, thisArg) {
        var result = initializer ? initializer() : {};
        iteratee = getCallback(iteratee, thisArg, 3);

        if (isArray(collection)) {
          var index = -1,
              length = collection.length;

          while (++index < length) {
            var value = collection[index];
            setter(result, value, iteratee(value, index, collection), collection);
          }
        } else {
          baseEach(collection, function(value, key, collection) {
            setter(result, value, iteratee(value, key, collection), collection);
          });
        }
        return result;
      };
    }


Creates a .assign, .defaults, or _.merge function.

API
private
Params
assigner Function The function to assign values.
Returns
Function Returns the new assigner function.
    function createAssigner(assigner) {
      return restParam(function(object, sources) {
        var index = -1,
            length = object == null ? 0 : sources.length,
            customizer = length > 2 ? sources[length - 2] : undefined,
            guard = length > 2 ? sources[2] : undefined,
            thisArg = length > 1 ? sources[length - 1] : undefined;

        if (typeof customizer == 'function') {
          customizer = bindCallback(customizer, thisArg, 5);
          length -= 2;
        } else {
          customizer = typeof thisArg == 'function' ? thisArg : undefined;
          length -= (customizer ? 1 : 0);
        }
        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
          customizer = length < 3 ? undefined : customizer;
          length = 1;
        }
        while (++index < length) {
          var source = sources[index];
          if (source) {
            assigner(object, source, customizer);
          }
        }
        return object;
      });
    }


Creates a baseEach or baseEachRight function.

API
private
Params
eachFunc Function The function to iterate over a collection.
[fromRight] boolean Specify iterating from right to left.
Returns
Function Returns the new base function.
    function createBaseEach(eachFunc, fromRight) {
      return function(collection, iteratee) {
        var length = collection ? getLength(collection) : 0;
        if (!isLength(length)) {
          return eachFunc(collection, iteratee);
        }
        var index = fromRight ? length : -1,
            iterable = toObject(collection);

        while ((fromRight ? index-- : ++index < length)) {
          if (iteratee(iterable[index], index, iterable) === false) {
            break;
          }
        }
        return collection;
      };
    }


Creates a base function for .forIn or .forInRight.

API
private
Params
[fromRight] boolean Specify iterating from right to left.
Returns
Function Returns the new base function.
    function createBaseFor(fromRight) {
      return function(object, iteratee, keysFunc) {
        var iterable = toObject(object),
            props = keysFunc(object),
            length = props.length,
            index = fromRight ? length : -1;

        while ((fromRight ? index-- : ++index < length)) {
          var key = props[index];
          if (iteratee(iterable[key], key, iterable) === false) {
            break;
          }
        }
        return object;
      };
    }


Creates a function that wraps func and invokes it with the this binding of thisArg.

API
private
Params
func Function The function to bind.
[thisArg] * The this binding of func.
Returns
Function Returns the new bound function.
    function createBindWrapper(func, thisArg) {
      var Ctor = createCtorWrapper(func);

      function wrapper() {
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return fn.apply(thisArg, arguments);
      }
      return wrapper;
    }


Creates a Set cache object to optimize linear searches of large arrays.

API
private
Params
[values] Array The values to cache.
Returns
null Object Returns the new cache object if Set is supported, else null.
    function createCache(values) {
      return (nativeCreate && Set) ? new SetCache(values) : null;
    }


Creates a function that produces compound words out of the words in a given string.

API
private
Params
callback Function The function to combine each word.
Returns
Function Returns the new compounder function.
    function createCompounder(callback) {
      return function(string) {
        var index = -1,
            array = words(deburr(string)),
            length = array.length,
            result = '';

        while (++index < length) {
          result = callback(result, array[index], index);
        }
        return result;
      };
    }


Creates a function that produces an instance of Ctor regardless of whether it was invoked as part of a new expression or by call or apply.

API
private
Params
Ctor Function The constructor to wrap.
Returns
Function Returns the new wrapped function.
    function createCtorWrapper(Ctor) {
      return function() {

Use a switch statement to work with class constructors. See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist for more details.

        var args = arguments;
        switch (args.length) {
          case 0: return new Ctor;
          case 1: return new Ctor(args[0]);
          case 2: return new Ctor(args[0], args[1]);
          case 3: return new Ctor(args[0], args[1], args[2]);
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
        }
        var thisBinding = baseCreate(Ctor.prototype),
            result = Ctor.apply(thisBinding, args);


Mimic the constructor's return behavior. See https://es5.github.io/#x13.2.2 for more details.

        return isObject(result) ? result : thisBinding;
      };
    }


Creates a .curry or .curryRight function.

API
private
Params
flag boolean The curry bit flag.
Returns
Function Returns the new curry function.
    function createCurry(flag) {
      function curryFunc(func, arity, guard) {
        if (guard && isIterateeCall(func, arity, guard)) {
          arity = undefined;
        }
        var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);
        result.placeholder = curryFunc.placeholder;
        return result;
      }
      return curryFunc;
    }


Creates a .defaults or .defaultsDeep function.

API
private
Params
assigner Function The function to assign values.
customizer Function The function to customize assigned values.
Returns
Function Returns the new defaults function.
    function createDefaults(assigner, customizer) {
      return restParam(function(args) {
        var object = args[0];
        if (object == null) {
          return object;
        }
        args.push(customizer);
        return assigner.apply(undefined, args);
      });
    }


Creates a .max or .min function.

API
private
Params
comparator Function The function used to compare values.
exValue * The initial extremum value.
Returns
Function Returns the new extremum function.
    function createExtremum(comparator, exValue) {
      return function(collection, iteratee, thisArg) {
        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
          iteratee = undefined;
        }
        iteratee = getCallback(iteratee, thisArg, 3);
        if (iteratee.length == 1) {
          collection = isArray(collection) ? collection : toIterable(collection);
          var result = arrayExtremum(collection, iteratee, comparator, exValue);
          if (!(collection.length && result === exValue)) {
            return result;
          }
        }
        return baseExtremum(collection, iteratee, comparator, exValue);
      };
    }


Creates a .find or .findLast function.

API
private
Params
eachFunc Function The function to iterate over a collection.
[fromRight] boolean Specify iterating from right to left.
Returns
Function Returns the new find function.
    function createFind(eachFunc, fromRight) {
      return function(collection, predicate, thisArg) {
        predicate = getCallback(predicate, thisArg, 3);
        if (isArray(collection)) {
          var index = baseFindIndex(collection, predicate, fromRight);
          return index > -1 ? collection[index] : undefined;
        }
        return baseFind(collection, predicate, eachFunc);
      };
    }


Creates a .findIndex or .findLastIndex function.

API
private
Params
[fromRight] boolean Specify iterating from right to left.
Returns
Function Returns the new find function.
    function createFindIndex(fromRight) {
      return function(array, predicate, thisArg) {
        if (!(array && array.length)) {
          return -1;
        }
        predicate = getCallback(predicate, thisArg, 3);
        return baseFindIndex(array, predicate, fromRight);
      };
    }


Creates a .findKey or .findLastKey function.

API
private
Params
objectFunc Function The function to iterate over an object.
Returns
Function Returns the new find function.
    function createFindKey(objectFunc) {
      return function(object, predicate, thisArg) {
        predicate = getCallback(predicate, thisArg, 3);
        return baseFind(object, predicate, objectFunc, true);
      };
    }


Creates a .flow or .flowRight function.

API
private
Params
[fromRight] boolean Specify iterating from right to left.
Returns
Function Returns the new flow function.
    function createFlow(fromRight) {
      return function() {
        var wrapper,
            length = arguments.length,
            index = fromRight ? length : -1,
            leftIndex = 0,
            funcs = Array(length);

        while ((fromRight ? index-- : ++index < length)) {
          var func = funcs[leftIndex++] = arguments[index];
          if (typeof func != 'function') {
            throw new TypeError(FUNC_ERROR_TEXT);
          }
          if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
            wrapper = new LodashWrapper([], true);
          }
        }
        index = wrapper ? -1 : length;
        while (++index < length) {
          func = funcs[index];

          var funcName = getFuncName(func),
              data = funcName == 'wrapper' ? getData(func) : undefined;

          if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
          } else {
            wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
          }
        }
        return function() {
          var args = arguments,
              value = args[0];

          if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {
            return wrapper.plant(value).value();
          }
          var index = 0,
              result = length ? funcs[index].apply(this, args) : value;

          while (++index < length) {
            result = funcs[index].call(this, result);
          }
          return result;
        };
      };
    }


Creates a function for .forEach or .forEachRight.

API
private
Params
arrayFunc Function The function to iterate over an array.
eachFunc Function The function to iterate over a collection.
Returns
Function Returns the new each function.
    function createForEach(arrayFunc, eachFunc) {
      return function(collection, iteratee, thisArg) {
        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
          ? arrayFunc(collection, iteratee)
          : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
      };
    }


Creates a function for .forIn or .forInRight.

API
private
Params
objectFunc Function The function to iterate over an object.
Returns
Function Returns the new each function.
    function createForIn(objectFunc) {
      return function(object, iteratee, thisArg) {
        if (typeof iteratee != 'function' || thisArg !== undefined) {
          iteratee = bindCallback(iteratee, thisArg, 3);
        }
        return objectFunc(object, iteratee, keysIn);
      };
    }


Creates a function for .forOwn or .forOwnRight.

API
private
Params
objectFunc Function The function to iterate over an object.
Returns
Function Returns the new each function.
    function createForOwn(objectFunc) {
      return function(object, iteratee, thisArg) {
        if (typeof iteratee != 'function' || thisArg !== undefined) {
          iteratee = bindCallback(iteratee, thisArg, 3);
        }
        return objectFunc(object, iteratee);
      };
    }


Creates a function for .mapKeys or .mapValues.

API
private
Params
[isMapKeys] boolean Specify mapping keys instead of values.
Returns
Function Returns the new map function.
    function createObjectMapper(isMapKeys) {
      return function(object, iteratee, thisArg) {
        var result = {};
        iteratee = getCallback(iteratee, thisArg, 3);

        baseForOwn(object, function(value, key, object) {
          var mapped = iteratee(value, key, object);
          key = isMapKeys ? mapped : key;
          value = isMapKeys ? value : mapped;
          result[key] = value;
        });
        return result;
      };
    }


Creates a function for .padLeft or .padRight.

API
private
Params
[fromRight] boolean Specify padding from the right.
Returns
Function Returns the new pad function.
    function createPadDir(fromRight) {
      return function(string, length, chars) {
        string = baseToString(string);
        return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
      };
    }


Creates a .partial or .partialRight function.

API
private
Params
flag boolean The partial bit flag.
Returns
Function Returns the new partial function.
    function createPartial(flag) {
      var partialFunc = restParam(function(func, partials) {
        var holders = replaceHolders(partials, partialFunc.placeholder);
        return createWrapper(func, flag, undefined, partials, holders);
      });
      return partialFunc;
    }


Creates a function for .reduce or .reduceRight.

API
private
Params
arrayFunc Function The function to iterate over an array.
eachFunc Function The function to iterate over a collection.
Returns
Function Returns the new each function.
    function createReduce(arrayFunc, eachFunc) {
      return function(collection, iteratee, accumulator, thisArg) {
        var initFromArray = arguments.length < 3;
        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
          ? arrayFunc(collection, iteratee, accumulator, initFromArray)
          : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
      };
    }


Creates a function that wraps func and invokes it with optional this binding of, partial application, and currying.

API
private
Params
func Function string The function or method name to reference.
bitmask number The bitmask of flags. See createWrapper for more details.
[thisArg] * The this binding of func.
[partials] Array The arguments to prepend to those provided to the new function.
[holders] Array The partials placeholder indexes.
[partialsRight] Array The arguments to append to those provided to the new function.
[holdersRight] Array The partialsRight placeholder indexes.
[argPos] Array The argument positions of the new function.
[ary] number The arity cap of func.
[arity] number The arity of func.
Returns
Function Returns the new wrapped function.
    function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
      var isAry = bitmask & ARY_FLAG,
          isBind = bitmask & BIND_FLAG,
          isBindKey = bitmask & BIND_KEY_FLAG,
          isCurry = bitmask & CURRY_FLAG,
          isCurryBound = bitmask & CURRY_BOUND_FLAG,
          isCurryRight = bitmask & CURRY_RIGHT_FLAG,
          Ctor = isBindKey ? undefined : createCtorWrapper(func);

      function wrapper() {

Avoid arguments object use disqualifying optimizations by converting it to an array before providing it to other functions.

        var length = arguments.length,
            index = length,
            args = Array(length);

        while (index--) {
          args[index] = arguments[index];
        }
        if (partials) {
          args = composeArgs(args, partials, holders);
        }
        if (partialsRight) {
          args = composeArgsRight(args, partialsRight, holdersRight);
        }
        if (isCurry || isCurryRight) {
          var placeholder = wrapper.placeholder,
              argsHolders = replaceHolders(args, placeholder);

          length -= argsHolders.length;
          if (length < arity) {
            var newArgPos = argPos ? arrayCopy(argPos) : undefined,
                newArity = nativeMax(arity - length, 0),
                newsHolders = isCurry ? argsHolders : undefined,
                newHoldersRight = isCurry ? undefined : argsHolders,
                newPartials = isCurry ? args : undefined,
                newPartialsRight = isCurry ? undefined : args;

            bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
            bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);

            if (!isCurryBound) {
              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
            }
            var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
                result = createHybridWrapper.apply(undefined, newData);

            if (isLaziable(func)) {
              setData(result, newData);
            }
            result.placeholder = placeholder;
            return result;
          }
        }
        var thisBinding = isBind ? thisArg : this,
            fn = isBindKey ? thisBinding[func] : func;

        if (argPos) {
          args = reorder(args, argPos);
        }
        if (isAry && ary < args.length) {
          args.length = ary;
        }
        if (this && this !== root && this instanceof wrapper) {
          fn = Ctor || createCtorWrapper(func);
        }
        return fn.apply(thisBinding, args);
      }
      return wrapper;
    }


Creates the padding required for string based on the given length. The chars string is truncated if the number of characters exceeds length.

API
private
Params
string string The string to create padding for.
[length=0] number The padding length.
[chars=' string '] The string used as padding.
Returns
string Returns the pad for string.
    function createPadding(string, length, chars) {
      var strLength = string.length;
      length = +length;

      if (strLength >= length || !nativeIsFinite(length)) {
        return '';
      }
      var padLength = length - strLength;
      chars = chars == null ? ' ' : (chars + '');
      return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);
    }


Creates a function that wraps func and invokes it with the optional this binding of thisArg and the partials prepended to those provided to the wrapper.

API
private
Params
func Function The function to partially apply arguments to.
bitmask number The bitmask of flags. See createWrapper for more details.
thisArg * The this binding of func.
partials Array The arguments to prepend to those provided to the new function.
Returns
Function Returns the new bound function.
    function createPartialWrapper(func, bitmask, thisArg, partials) {
      var isBind = bitmask & BIND_FLAG,
          Ctor = createCtorWrapper(func);

      function wrapper() {

Avoid arguments object use disqualifying optimizations by converting it to an array before providing it func.

        var argsIndex = -1,
            argsLength = arguments.length,
            leftIndex = -1,
            leftLength = partials.length,
            args = Array(leftLength + argsLength);

        while (++leftIndex < leftLength) {
          args[leftIndex] = partials[leftIndex];
        }
        while (argsLength--) {
          args[leftIndex++] = arguments[++argsIndex];
        }
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
        return fn.apply(isBind ? thisArg : this, args);
      }
      return wrapper;
    }


Creates a .ceil, .floor, or _.round function.

API
private
Params
methodName string The name of the Math method to use when rounding.
Returns
Function Returns the new round function.
    function createRound(methodName) {
      var func = Math[methodName];
      return function(number, precision) {
        precision = precision === undefined ? 0 : (+precision || 0);
        if (precision) {
          precision = pow(10, precision);
          return func(number * precision) / precision;
        }
        return func(number);
      };
    }


Creates a .sortedIndex or .sortedLastIndex function.

API
private
Params
[retHighest] boolean Specify returning the highest qualified index.
Returns
Function Returns the new index function.
    function createSortedIndex(retHighest) {
      return function(array, value, iteratee, thisArg) {
        var callback = getCallback(iteratee);
        return (iteratee == null && callback === baseCallback)
          ? binaryIndex(array, value, retHighest)
          : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);
      };
    }


Creates a function that either curries or invokes func with optional this binding and partially applied arguments.

API
private
Params
func Function string The function or method name to reference.
bitmask number The bitmask of flags. The bitmask may be composed of the following flags: 1 - .bind 2 - .bindKey 4 - .curry or .curryRight of a bound function 8 - .curry 16 - .curryRight 32 - .partial 64 - .partialRight 128 - .rearg 256 - .ary
[thisArg] * The this binding of func.
[partials] Array The arguments to be partially applied.
[holders] Array The partials placeholder indexes.
[argPos] Array The argument positions of the new function.
[ary] number The arity cap of func.
[arity] number The arity of func.
Returns
Function Returns the new wrapped function.
    function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
      var isBindKey = bitmask & BIND_KEY_FLAG;
      if (!isBindKey && typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var length = partials ? partials.length : 0;
      if (!length) {
        bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
        partials = holders = undefined;
      }
      length -= (holders ? holders.length : 0);
      if (bitmask & PARTIAL_RIGHT_FLAG) {
        var partialsRight = partials,
            holdersRight = holders;

        partials = holders = undefined;
      }
      var data = isBindKey ? undefined : getData(func),
          newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];

      if (data) {
        mergeData(newData, data);
        bitmask = newData[1];
        arity = newData[9];
      }
      newData[9] = arity == null
        ? (isBindKey ? 0 : func.length)
        : (nativeMax(arity - length, 0) || 0);

      if (bitmask == BIND_FLAG) {
        var result = createBindWrapper(newData[0], newData[2]);
      } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
        result = createPartialWrapper.apply(undefined, newData);
      } else {
        result = createHybridWrapper.apply(undefined, newData);
      }
      var setter = data ? baseSetData : setData;
      return setter(result, newData);
    }


A specialized version of baseIsEqualDeep for arrays with support for partial deep comparisons.

API
private
Params
array Array The array to compare.
other Array The other array to compare.
equalFunc Function The function to determine equivalents of values.
[customizer] Function The function to customize comparing arrays.
[isLoose] boolean Specify performing partial comparisons.
[stackA] Array Tracks traversed value objects.
[stackB] Array Tracks traversed other objects.
Returns
boolean Returns true if the arrays are equivalent, else false.
    function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
      var index = -1,
          arrLength = array.length,
          othLength = other.length;

      if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
        return false;
      }

Ignore non-index properties.

      while (++index < arrLength) {
        var arrValue = array[index],
            othValue = other[index],
            result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;

        if (result !== undefined) {
          if (result) {
            continue;
          }
          return false;
        }

Recursively compare arrays (susceptible to call stack limits).

        if (isLoose) {
          if (!arraySome(other, function(othValue) {
                return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
              })) {
            return false;
          }
        } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
          return false;
        }
      }
      return true;
    }


A specialized version of baseIsEqualDeep for comparing objects of the same toStringTag.

Note: This function only supports comparing values with tags of Boolean, Date, Error, Number, RegExp, or String.

API
private
Params
object Object The object to compare.
other Object The other object to compare.
tag string The toStringTag of the objects to compare.
Returns
boolean Returns true if the objects are equivalent, else false.
    function equalByTag(object, other, tag) {
      switch (tag) {
        case boolTag:
        case dateTag:

Coerce dates and booleans to numbers, dates to milliseconds and booleans to 1 or 0 treating invalid dates coerced to NaN as not equal.

          return +object == +other;

        case errorTag:
          return object.name == other.name && object.message == other.message;

        case numberTag:

Treat NaN vs. NaN as equal.

          return (object != +object)
            ? other != +other
            : object == +other;

        case regexpTag:
        case stringTag:

Coerce regexes to strings and treat strings primitives and string objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.

          return object == (other + '');
      }
      return false;
    }


A specialized version of baseIsEqualDeep for objects with support for partial deep comparisons.

API
private
Params
object Object The object to compare.
other Object The other object to compare.
equalFunc Function The function to determine equivalents of values.
[customizer] Function The function to customize comparing values.
[isLoose] boolean Specify performing partial comparisons.
[stackA] Array Tracks traversed value objects.
[stackB] Array Tracks traversed other objects.
Returns
boolean Returns true if the objects are equivalent, else false.
    function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
      var objProps = keys(object),
          objLength = objProps.length,
          othProps = keys(other),
          othLength = othProps.length;

      if (objLength != othLength && !isLoose) {
        return false;
      }
      var index = objLength;
      while (index--) {
        var key = objProps[index];
        if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
          return false;
        }
      }
      var skipCtor = isLoose;
      while (++index < objLength) {
        key = objProps[index];
        var objValue = object[key],
            othValue = other[key],
            result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;


Recursively compare objects (susceptible to call stack limits).

        if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
          return false;
        }
        skipCtor || (skipCtor = key == 'constructor');
      }
      if (!skipCtor) {
        var objCtor = object.constructor,
            othCtor = other.constructor;


Non Object object instances with different constructors are not equal.

        if (objCtor != othCtor &&
            ('constructor' in object && 'constructor' in other) &&
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
          return false;
        }
      }
      return true;
    }


Gets the appropriate "callback" function. If the _.callback method is customized this function returns the custom method, otherwise it returns the baseCallback function. If arguments are provided the chosen function is invoked with them and its result is returned.

API
private
Returns
Function Returns the chosen function or its result.
    function getCallback(func, thisArg, argCount) {
      var result = lodash.callback || callback;
      result = result === callback ? baseCallback : result;
      return argCount ? result(func, thisArg, argCount) : result;
    }


Gets metadata for func.

API
private
Params
func Function The function to query.
Returns
* Returns the metadata for func.
    var getData = !metaMap ? noop : function(func) {
      return metaMap.get(func);
    };


Gets the name of func.

API
private
Params
func Function The function to query.
Returns
string Returns the function name.
    function getFuncName(func) {
      var result = func.name,
          array = realNames[result],
          length = array ? array.length : 0;

      while (length--) {
        var data = array[length],
            otherFunc = data.func;
        if (otherFunc == null || otherFunc == func) {
          return data.name;
        }
      }
      return result;
    }


Gets the appropriate "indexOf" function. If the _.indexOf method is customized this function returns the custom method, otherwise it returns the baseIndexOf function. If arguments are provided the chosen function is invoked with them and its result is returned.

API
private
Returns
Function number Returns the chosen function or its result.
    function getIndexOf(collection, target, fromIndex) {
      var result = lodash.indexOf || indexOf;
      result = result === indexOf ? baseIndexOf : result;
      return collection ? result(collection, target, fromIndex) : result;
    }


Gets the "length" property value of object.

Note: This function is used to avoid a JIT bug that affects Safari on at least iOS 8.1-8.3 ARM64.

API
private
Params
object Object The object to query.
Returns
* Returns the "length" value.
    var getLength = baseProperty('length');


Gets the propery names, values, and compare flags of object.

API
private
Params
object Object The object to query.
Returns
Array Returns the match data of object.
    function getMatchData(object) {
      var result = pairs(object),
          length = result.length;

      while (length--) {
        result[length][2] = isStrictComparable(result[length][1]);
      }
      return result;
    }


Gets the native function at key of object.

API
private
Params
object Object The object to query.
key string The key of the method to get.
Returns
* Returns the function if it's native, else undefined.
    function getNative(object, key) {
      var value = object == null ? undefined : object[key];
      return isNative(value) ? value : undefined;
    }


Gets the view, applying any transforms to the start and end positions.

API
private
Params
start number The start of the view.
end number The end of the view.
transforms Array The transformations to apply to the view.
Returns
Object Returns an object containing the start and end positions of the view.
    function getView(start, end, transforms) {
      var index = -1,
          length = transforms.length;

      while (++index < length) {
        var data = transforms[index],
            size = data.size;

        switch (data.type) {
          case 'drop':      start += size; break;
          case 'dropRight': end -= size; break;
          case 'take':      end = nativeMin(end, start + size); break;
          case 'takeRight': start = nativeMax(start, end - size); break;
        }
      }
      return { 'start': start, 'end': end };
    }


Initializes an array clone.

API
private
Params
array Array The array to clone.
Returns
Array Returns the initialized clone.
    function initCloneArray(array) {
      var length = array.length,
          result = new array.constructor(length);


Add array properties assigned by RegExp#exec.

      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
        result.index = array.index;
        result.input = array.input;
      }
      return result;
    }


Initializes an object clone.

API
private
Params
object Object The object to clone.
Returns
Object Returns the initialized clone.
    function initCloneObject(object) {
      var Ctor = object.constructor;
      if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
        Ctor = Object;
      }
      return new Ctor;
    }


Initializes an object clone based on its toStringTag.

Note: This function only supports cloning values with tags of Boolean, Date, Error, Number, RegExp, or String.

API
private
Params
object Object The object to clone.
tag string The toStringTag of the object to clone.
[isDeep] boolean Specify a deep clone.
Returns
Object Returns the initialized clone.
    function initCloneByTag(object, tag, isDeep) {
      var Ctor = object.constructor;
      switch (tag) {
        case arrayBufferTag:
          return bufferClone(object);

        case boolTag:
        case dateTag:
          return new Ctor(+object);

        case float32Tag: case float64Tag:
        case int8Tag: case int16Tag: case int32Tag:
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
          var buffer = object.buffer;
          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);

        case numberTag:
        case stringTag:
          return new Ctor(object);

        case regexpTag:
          var result = new Ctor(object.source, reFlags.exec(object));
          result.lastIndex = object.lastIndex;
      }
      return result;
    }


Invokes the method at path on object.

API
private
Params
object Object The object to query.
path Array string The path of the method to invoke.
args Array The arguments to invoke the method with.
Returns
* Returns the result of the invoked method.
    function invokePath(object, path, args) {
      if (object != null && !isKey(path, object)) {
        path = toPath(path);
        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
        path = last(path);
      }
      var func = object == null ? object : object[path];
      return func == null ? undefined : func.apply(object, args);
    }


Checks if value is array-like.

API
private
Params
value * The value to check.
Returns
boolean Returns true if value is array-like, else false.
    function isArrayLike(value) {
      return value != null && isLength(getLength(value));
    }


Checks if value is a valid array-like index.

API
private
Params
value * The value to check.
[length=MAX_SAFE_INTEGER] number The upper bounds of a valid index.
Returns
boolean Returns true if value is a valid index, else false.
    function isIndex(value, length) {
      value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
      length = length == null ? MAX_SAFE_INTEGER : length;
      return value > -1 && value % 1 == 0 && value < length;
    }


Checks if the provided arguments are from an iteratee call.

API
private
Params
value The potential iteratee value argument.
index The potential iteratee index or key argument.
object * The potential iteratee object argument.
Returns
boolean Returns true if the arguments are from an iteratee call, else false.
    function isIterateeCall(value, index, object) {
      if (!isObject(object)) {
        return false;
      }
      var type = typeof index;
      if (type == 'number'
          ? (isArrayLike(object) && isIndex(index, object.length))
          : (type == 'string' && index in object)) {
        var other = object[index];
        return value === value ? (value === other) : (other !== other);
      }
      return false;
    }


Checks if value is a property name and not a property path.

API
private
Params
value * The value to check.
[object] Object The object to query keys on.
Returns
boolean Returns true if value is a property name, else false.
    function isKey(value, object) {
      var type = typeof value;
      if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
        return true;
      }
      if (isArray(value)) {
        return false;
      }
      var result = !reIsDeepProp.test(value);
      return result || (object != null && value in toObject(object));
    }


Checks if func has a lazy counterpart.

API
private
Params
func Function The function to check.
Returns
boolean Returns true if func has a lazy counterpart, else false.
    function isLaziable(func) {
      var funcName = getFuncName(func);
      if (!(funcName in LazyWrapper.prototype)) {
        return false;
      }
      var other = lodash[funcName];
      if (func === other) {
        return true;
      }
      var data = getData(other);
      return !!data && func === data[0];
    }


Checks if value is a valid array-like length.

Note: This function is based on ToLength.

API
private
Params
value * The value to check.
Returns
boolean Returns true if value is a valid length, else false.
    function isLength(value) {
      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
    }


Checks if value is suitable for strict equality comparisons, i.e. ===.

API
private
Params
value * The value to check.
Returns
boolean Returns true if value if suitable for strict equality comparisons, else false.
    function isStrictComparable(value) {
      return value === value && !isObject(value);
    }


Merges the function metadata of source into data.

Merging metadata reduces the number of wrappers required to invoke a function. This is possible because methods like .bind, .curry, and .partial may be applied regardless of execution order. Methods like .ary and .rearg augment function arguments, making the order in which they are executed important, preventing the merging of metadata. However, we make an exception for a safe common case where curried functions have .ary and or _.rearg applied.

API
private
Params
data Array The destination metadata.
source Array The source metadata.
Returns
Array Returns data.
    function mergeData(data, source) {
      var bitmask = data[1],
          srcBitmask = source[1],
          newBitmask = bitmask | srcBitmask,
          isCommon = newBitmask < ARY_FLAG;

      var isCombo =
        (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
        (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
        (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);


Exit early if metadata can't be merged.

      if (!(isCommon || isCombo)) {
        return data;
      }

Use source thisArg if available.

      if (srcBitmask & BIND_FLAG) {
        data[2] = source[2];

Set when currying a bound function.

        newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
      }

Compose partial arguments.

      var value = source[3];
      if (value) {
        var partials = data[3];
        data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);
      }

Compose partial right arguments.

      value = source[5];
      if (value) {
        partials = data[5];
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);
      }

Use source argPos if available.

      value = source[7];
      if (value) {
        data[7] = arrayCopy(value);
      }

Use source ary if it's smaller.

      if (srcBitmask & ARY_FLAG) {
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
      }

Use source arity if one is not provided.

      if (data[9] == null) {
        data[9] = source[9];
      }

Use source func and merge bitmasks.

      data[0] = source[0];
      data[1] = newBitmask;

      return data;
    }


Used by .defaultsDeep to customize its .merge use.

API
private
Params
objectValue The destination object property value.
sourceValue The source object property value.
Returns
* Returns the value to assign to the destination object.
    function mergeDefaults(objectValue, sourceValue) {
      return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);
    }


A specialized version of _.pick which picks object properties specified by props.

API
private
Params
object Object The source object.
props string[] The property names to pick.
Returns
Object Returns the new object.
    function pickByArray(object, props) {
      object = toObject(object);

      var index = -1,
          length = props.length,
          result = {};

      while (++index < length) {
        var key = props[index];
        if (key in object) {
          result[key] = object[key];
        }
      }
      return result;
    }


A specialized version of _.pick which picks object properties predicate returns truthy for.

API
private
Params
object Object The source object.
predicate Function The function invoked per iteration.
Returns
Object Returns the new object.
    function pickByCallback(object, predicate) {
      var result = {};
      baseForIn(object, function(value, key, object) {
        if (predicate(value, key, object)) {
          result[key] = value;
        }
      });
      return result;
    }


Reorder array according to the specified indexes where the element at the first index is assigned as the first element, the element at the second index is assigned as the second element, and so on.

API
private
Params
array Array The array to reorder.
indexes Array The arranged array indexes.
Returns
Array Returns array.
    function reorder(array, indexes) {
      var arrLength = array.length,
          length = nativeMin(indexes.length, arrLength),
          oldArray = arrayCopy(array);

      while (length--) {
        var index = indexes[length];
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
      }
      return array;
    }


Sets metadata for func.

Note: If this function becomes hot, i.e. is invoked a lot in a short period of time, it will trip its breaker and transition to an identity function to avoid garbage collection pauses in V8. See V8 issue 2070 for more details.

API
private
Params
func Function The function to associate metadata with.
data * The metadata.
Returns
Function Returns func.
    var setData = (function() {
      var count = 0,
          lastCalled = 0;

      return function(key, value) {
        var stamp = now(),
            remaining = HOT_SPAN - (stamp - lastCalled);

        lastCalled = stamp;
        if (remaining > 0) {
          if (++count >= HOT_COUNT) {
            return key;
          }
        } else {
          count = 0;
        }
        return baseSetData(key, value);
      };
    }());


A fallback implementation of Object.keys which creates an array of the own enumerable property names of object.

API
private
Params
object Object The object to query.
Returns
Array Returns the array of property names.
    function shimKeys(object) {
      var props = keysIn(object),
          propsLength = props.length,
          length = propsLength && object.length;

      var allowIndexes = !!length && isLength(length) &&
        (isArray(object) || isArguments(object));

      var index = -1,
          result = [];

      while (++index < propsLength) {
        var key = props[index];
        if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
          result.push(key);
        }
      }
      return result;
    }


Converts value to an array-like object if it's not one.

API
private
Params
value * The value to process.
Returns
Array Object Returns the array-like object.
    function toIterable(value) {
      if (value == null) {
        return [];
      }
      if (!isArrayLike(value)) {
        return values(value);
      }
      return isObject(value) ? value : Object(value);
    }


Converts value to an object if it's not one.

API
private
Params
value * The value to process.
Returns
Object Returns the object.
    function toObject(value) {
      return isObject(value) ? value : Object(value);
    }


Converts value to property path array if it's not one.

API
private
Params
value * The value to process.
Returns
Array Returns the property path array.
    function toPath(value) {
      if (isArray(value)) {
        return value;
      }
      var result = [];
      baseToString(value).replace(rePropName, function(match, number, quote, string) {
        result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
      });
      return result;
    }


Creates a clone of wrapper.

API
private
Params
wrapper Object The wrapper to clone.
Returns
Object Returns the cloned wrapper.
    function wrapperClone(wrapper) {
      return wrapper instanceof LazyWrapper
        ? wrapper.clone()
        : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));
    }

    /*------------------------------------------------------------------------*/


Creates an array of elements split into groups the length of size. If collection can't be split evenly, the final chunk will be the remaining elements.

static
memberOf
category
Array
Params
array Array The array to process.
[size=1] number The length of each chunk.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the new array containing chunks.
example .chunk(['a',
'b', 'c', 'd'], 2); // => [['a', 'b'], ['c', 'd']] .chunk(['a', 'b', 'c', 'd'], 3); // => [['a', 'b', 'c'], ['d']]
    function chunk(array, size, guard) {
      if (guard ? isIterateeCall(array, size, guard) : size == null) {
        size = 1;
      } else {
        size = nativeMax(nativeFloor(size) || 1, 1);
      }
      var index = 0,
          length = array ? array.length : 0,
          resIndex = -1,
          result = Array(nativeCeil(length / size));

      while (index < length) {
        result[++resIndex] = baseSlice(array, index, (index += size));
      }
      return result;
    }


Creates an array with all falsey values removed. The values false, null, 0, "", undefined, and NaN are falsey.

static
memberOf
category
Array
Params
array Array The array to compact.
Returns
Array Returns the new array of filtered values.
example .compact([0,
1, false, 2, '', 3]); // => [1, 2, 3]
    function compact(array) {
      var index = -1,
          length = array ? array.length : 0,
          resIndex = -1,
          result = [];

      while (++index < length) {
        var value = array[index];
        if (value) {
          result[++resIndex] = value;
        }
      }
      return result;
    }


Creates an array of unique array values not included in the other provided arrays using SameValueZero for equality comparisons.

static
memberOf
category
Array
Params
array Array The array to inspect.
[values] ...Array The arrays of values to exclude.
Returns
Array Returns the new array of filtered values.
example .difference([1,
2, 3], [4, 2]); // => [1, 3]
    var difference = restParam(function(array, values) {
      return (isObjectLike(array) && isArrayLike(array))
        ? baseDifference(array, baseFlatten(values, false, true))
        : [];
    });


Creates a slice of array with n elements dropped from the beginning.

static
memberOf
category
Array
Params
array Array The array to query.
[n=1] number The number of elements to drop.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the slice of array.
example .drop([1,
2, 3]); // => [2, 3] .drop([1, 2, 3], 2); // => [3] .drop([1, 2, 3], 5); // => [] .drop([1, 2, 3], 0); // => [1, 2, 3]
    function drop(array, n, guard) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (guard ? isIterateeCall(array, n, guard) : n == null) {
        n = 1;
      }
      return baseSlice(array, n < 0 ? 0 : n);
    }


Creates a slice of array with n elements dropped from the end.

static
memberOf
category
Array
Params
array Array The array to query.
[n=1] number The number of elements to drop.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the slice of array.
example .dropRight([1,
2, 3]); // => [1, 2] .dropRight([1, 2, 3], 2); // => [1] .dropRight([1, 2, 3], 5); // => [] .dropRight([1, 2, 3], 0); // => [1, 2, 3]
    function dropRight(array, n, guard) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (guard ? isIterateeCall(array, n, guard) : n == null) {
        n = 1;
      }
      n = length - (+n || 0);
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }


Creates a slice of array excluding elements dropped from the end. Elements are dropped until predicate returns falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that match the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to query.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the slice of array.
example .dropRightWhile([1,
2, 3], function(n) { return n > 1; }); // => [1] var users = [ { 'user': 'barney', 'active': true }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': false } ]; // using the .matches callback shorthand .pluck(.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); // => ['barney', 'fred'] // using the .matchesProperty callback shorthand .pluck(.dropRightWhile(users, 'active', false), 'user'); // => ['barney'] // using the _.property callback shorthand .pluck(.dropRightWhile(users, 'active'), 'user'); // => ['barney', 'fred', 'pebbles']
    function dropRightWhile(array, predicate, thisArg) {
      return (array && array.length)
        ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)
        : [];
    }


Creates a slice of array excluding elements dropped from the beginning. Elements are dropped until predicate returns falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to query.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the slice of array.
example .dropWhile([1,
2, 3], function(n) { return n < 3; }); // => [3] var users = [ { 'user': 'barney', 'active': false }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': true } ]; // using the .matches callback shorthand .pluck(.dropWhile(users, { 'user': 'barney', 'active': false }), 'user'); // => ['fred', 'pebbles'] // using the .matchesProperty callback shorthand .pluck(.dropWhile(users, 'active', false), 'user'); // => ['pebbles'] // using the _.property callback shorthand .pluck(.dropWhile(users, 'active'), 'user'); // => ['barney', 'fred', 'pebbles']
    function dropWhile(array, predicate, thisArg) {
      return (array && array.length)
        ? baseWhile(array, getCallback(predicate, thisArg, 3), true)
        : [];
    }


Fills elements of array with value from start up to, but not including, end.

Note: This method mutates array.

static
memberOf
category
Array
Params
array Array The array to fill.
value * The value to fill array with.
[start=0] number The start position.
[end=array.length] number The end position.
Returns
Array Returns array.
example var
array = [1, 2, 3]; .fill(array, 'a'); console.log(array); // => ['a', 'a', 'a'] .fill(Array(3), 2); // => [2, 2, 2] .fill([4, 6, 8], '', 1, 2); // => [4, '', 8]
    function fill(array, value, start, end) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
        start = 0;
        end = length;
      }
      return baseFill(array, value, start, end);
    }


This method is like .find except that it returns the index of the first element predicate returns truthy for instead of the element itself.

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
number Returns the index of the found element, else -1.
example var
users = [ { 'user': 'barney', 'active': false }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': true } ]; .findIndex(users, function(chr) { return chr.user == 'barney'; }); // => 0 // using the .matches callback shorthand .findIndex(users, { 'user': 'fred', 'active': false }); // => 1 // using the .matchesProperty callback shorthand .findIndex(users, 'active', false); // => 0 // using the .property callback shorthand _.findIndex(users, 'active'); // => 2
    var findIndex = createFindIndex();


This method is like .findIndex except that it iterates over elements of collection from right to left.

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
number Returns the index of the found element, else -1.
example var
users = [ { 'user': 'barney', 'active': true }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': false } ]; .findLastIndex(users, function(chr) { return chr.user == 'pebbles'; }); // => 2 // using the .matches callback shorthand .findLastIndex(users, { 'user': 'barney', 'active': true }); // => 0 // using the .matchesProperty callback shorthand .findLastIndex(users, 'active', false); // => 2 // using the .property callback shorthand _.findLastIndex(users, 'active'); // => 0
    var findLastIndex = createFindIndex(true);


Gets the first element of array.

static
memberOf
alias
head
category
Array
Params
array Array The array to query.
Returns
* Returns the first element of array.
example .first([1,
2, 3]); // => 1 _.first([]); // => undefined
    function first(array) {
      return array ? array[0] : undefined;
    }


Flattens a nested array. If isDeep is true the array is recursively flattened, otherwise it is only flattened a single level.

static
memberOf
category
Array
Params
array Array The array to flatten.
[isDeep] boolean Specify a deep flatten.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the new flattened array.
example .flatten([1,
[2, 3, [4]]]); // => [1, 2, 3, [4]] // using isDeep .flatten([1, [2, 3, [4]]], true); // => [1, 2, 3, 4]
    function flatten(array, isDeep, guard) {
      var length = array ? array.length : 0;
      if (guard && isIterateeCall(array, isDeep, guard)) {
        isDeep = false;
      }
      return length ? baseFlatten(array, isDeep) : [];
    }


Recursively flattens a nested array.

static
memberOf
category
Array
Params
array Array The array to recursively flatten.
Returns
Array Returns the new flattened array.
example .flattenDeep([1,
[2, 3, [4]]]); // => [1, 2, 3, 4]
    function flattenDeep(array) {
      var length = array ? array.length : 0;
      return length ? baseFlatten(array, true) : [];
    }


Gets the index at which the first occurrence of value is found in array using SameValueZero for equality comparisons. If fromIndex is negative, it is used as the offset from the end of array. If array is sorted providing true for fromIndex performs a faster binary search.

static
memberOf
category
Array
Params
array Array The array to search.
value * The value to search for.
[fromIndex=0] boolean number The index to search from or true to perform a binary search on a sorted array.
Returns
number Returns the index of the matched value, else -1.
example .indexOf([1,
2, 1, 2], 2); // => 1 // using fromIndex .indexOf([1, 2, 1, 2], 2, 2); // => 3 // performing a binary search .indexOf([1, 1, 2, 2], 2, true); // => 2
    function indexOf(array, value, fromIndex) {
      var length = array ? array.length : 0;
      if (!length) {
        return -1;
      }
      if (typeof fromIndex == 'number') {
        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
      } else if (fromIndex) {
        var index = binaryIndex(array, value);
        if (index < length &&
            (value === value ? (value === array[index]) : (array[index] !== array[index]))) {
          return index;
        }
        return -1;
      }
      return baseIndexOf(array, value, fromIndex || 0);
    }


Gets all but the last element of array.

static
memberOf
category
Array
Params
array Array The array to query.
Returns
Array Returns the slice of array.
example .initial([1,
2, 3]); // => [1, 2]
    function initial(array) {
      return dropRight(array, 1);
    }


Creates an array of unique values that are included in all of the provided arrays using SameValueZero for equality comparisons.

static
memberOf
category
Array
Params
[arrays] ...Array The arrays to inspect.
Returns
Array Returns the new array of shared values.
example .intersection([1,
2], [4, 2], [2, 1]); // => [2]
    var intersection = restParam(function(arrays) {
      var othLength = arrays.length,
          othIndex = othLength,
          caches = Array(length),
          indexOf = getIndexOf(),
          isCommon = indexOf == baseIndexOf,
          result = [];

      while (othIndex--) {
        var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
        caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
      }
      var array = arrays[0],
          index = -1,
          length = array ? array.length : 0,
          seen = caches[0];

      outer:
      while (++index < length) {
        value = array[index];
        if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
          var othIndex = othLength;
          while (--othIndex) {
            var cache = caches[othIndex];
            if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
              continue outer;
            }
          }
          if (seen) {
            seen.push(value);
          }
          result.push(value);
        }
      }
      return result;
    });


Gets the last element of array.

static
memberOf
category
Array
Params
array Array The array to query.
Returns
* Returns the last element of array.
example .last([1,
2, 3]); // => 3
    function last(array) {
      var length = array ? array.length : 0;
      return length ? array[length - 1] : undefined;
    }


This method is like .indexOf except that it iterates over elements of array from right to left.

static
memberOf
category
Array
Params
array Array The array to search.
value * The value to search for.
[fromIndex=array.length-1] boolean number The index to search from or true to perform a binary search on a sorted array.
Returns
number Returns the index of the matched value, else -1.
example .lastIndexOf([1,
2, 1, 2], 2); // => 3 // using fromIndex .lastIndexOf([1, 2, 1, 2], 2, 2); // => 1 // performing a binary search _.lastIndexOf([1, 1, 2, 2], 2, true); // => 3
    function lastIndexOf(array, value, fromIndex) {
      var length = array ? array.length : 0;
      if (!length) {
        return -1;
      }
      var index = length;
      if (typeof fromIndex == 'number') {
        index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
      } else if (fromIndex) {
        index = binaryIndex(array, value, true) - 1;
        var other = array[index];
        if (value === value ? (value === other) : (other !== other)) {
          return index;
        }
        return -1;
      }
      if (value !== value) {
        return indexOfNaN(array, index, true);
      }
      while (index--) {
        if (array[index] === value) {
          return index;
        }
      }
      return -1;
    }


Removes all provided values from array using SameValueZero for equality comparisons.

Note: Unlike .without, this method mutates array.

static
memberOf
category
Array
Params
array Array The array to modify.
[values] ...* The values to remove.
Returns
Array Returns array.
example var
array = [1, 2, 3, 1, 2, 3]; _.pull(array, 2, 3); console.log(array); // => [1, 1]
    function pull() {
      var args = arguments,
          array = args[0];

      if (!(array && array.length)) {
        return array;
      }
      var index = 0,
          indexOf = getIndexOf(),
          length = args.length;

      while (++index < length) {
        var fromIndex = 0,
            value = args[index];

        while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
          splice.call(array, fromIndex, 1);
        }
      }
      return array;
    }


Removes elements from array corresponding to the given indexes and returns an array of the removed elements. Indexes may be specified as an array of indexes or as individual arguments.

Note: Unlike .at, this method mutates array.

static
memberOf
category
Array
Params
array Array The array to modify.
[indexes] ...(number number[]) The indexes of elements to remove, specified as individual indexes or arrays of indexes.
Returns
Array Returns the new array of removed elements.
example var
array = [5, 10, 15, 20]; var evens = _.pullAt(array, 1, 3); console.log(array); // => [5, 15] console.log(evens); // => [10, 20]
    var pullAt = restParam(function(array, indexes) {
      indexes = baseFlatten(indexes);

      var result = baseAt(array, indexes);
      basePullAt(array, indexes.sort(baseCompareAscending));
      return result;
    });


Removes all elements from array that predicate returns truthy for and returns an array of the removed elements. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

Note: Unlike .filter, this method mutates array.

static
memberOf
category
Array
Params
array Array The array to modify.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the new array of removed elements.
example var
array = [1, 2, 3, 4]; var evens = _.remove(array, function(n) { return n % 2 == 0; }); console.log(array); // => [1, 3] console.log(evens); // => [2, 4]
    function remove(array, predicate, thisArg) {
      var result = [];
      if (!(array && array.length)) {
        return result;
      }
      var index = -1,
          indexes = [],
          length = array.length;

      predicate = getCallback(predicate, thisArg, 3);
      while (++index < length) {
        var value = array[index];
        if (predicate(value, index, array)) {
          result.push(value);
          indexes.push(index);
        }
      }
      basePullAt(array, indexes);
      return result;
    }


Gets all but the first element of array.

static
memberOf
alias
tail
category
Array
Params
array Array The array to query.
Returns
Array Returns the slice of array.
example .rest([1,
2, 3]); // => [2, 3]
    function rest(array) {
      return drop(array, 1);
    }


Creates a slice of array from start up to, but not including, end.

Note: This method is used instead of Array#slice to support node lists in IE < 9 and to ensure dense arrays are returned.

static
memberOf
_
category
Array
Params
array Array The array to slice.
[start=0] number The start position.
[end=array.length] number The end position.
Returns
Array Returns the slice of array.
    function slice(array, start, end) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
        start = 0;
        end = length;
      }
      return baseSlice(array, start, end);
    }


Uses a binary search to determine the lowest index at which value should be inserted into array in order to maintain its sort order. If an iteratee function is provided it is invoked for value and each element of array to compute their sort ranking. The iteratee is bound to thisArg and invoked with one argument; (value).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The sorted array to inspect.
value The value to evaluate.
[iteratee=_.identity] Function Object string The function invoked per iteration.
[thisArg] The this binding of iteratee.
Returns
number Returns the index at which value should be inserted into array.
example .sortedIndex([30,
50], 40); // => 1 .sortedIndex([4, 4, 5, 5], 5); // => 2 var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } }; // using an iteratee function .sortedIndex(['thirty', 'fifty'], 'forty', function(word) { return this.data[word]; }, dict); // => 1 // using the .property callback shorthand _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x'); // => 1
    var sortedIndex = createSortedIndex();


This method is like .sortedIndex except that it returns the highest index at which value should be inserted into array in order to maintain its sort order.

static
memberOf
category
Array
Params
array Array The sorted array to inspect.
value The value to evaluate.
[iteratee=_.identity] Function Object string The function invoked per iteration.
[thisArg] The this binding of iteratee.
Returns
number Returns the index at which value should be inserted into array.
example _.sortedLastIndex([4,
4, 5, 5], 5); // => 4
    var sortedLastIndex = createSortedIndex(true);


Creates a slice of array with n elements taken from the beginning.

static
memberOf
category
Array
Params
array Array The array to query.
[n=1] number The number of elements to take.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the slice of array.
example .take([1,
2, 3]); // => [1] .take([1, 2, 3], 2); // => [1, 2] .take([1, 2, 3], 5); // => [1, 2, 3] .take([1, 2, 3], 0); // => []
    function take(array, n, guard) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (guard ? isIterateeCall(array, n, guard) : n == null) {
        n = 1;
      }
      return baseSlice(array, 0, n < 0 ? 0 : n);
    }


Creates a slice of array with n elements taken from the end.

static
memberOf
category
Array
Params
array Array The array to query.
[n=1] number The number of elements to take.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Array Returns the slice of array.
example .takeRight([1,
2, 3]); // => [3] .takeRight([1, 2, 3], 2); // => [2, 3] .takeRight([1, 2, 3], 5); // => [1, 2, 3] .takeRight([1, 2, 3], 0); // => []
    function takeRight(array, n, guard) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (guard ? isIterateeCall(array, n, guard) : n == null) {
        n = 1;
      }
      n = length - (+n || 0);
      return baseSlice(array, n < 0 ? 0 : n);
    }


Creates a slice of array with elements taken from the end. Elements are taken until predicate returns falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to query.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the slice of array.
example .takeRightWhile([1,
2, 3], function(n) { return n > 1; }); // => [2, 3] var users = [ { 'user': 'barney', 'active': true }, { 'user': 'fred', 'active': false }, { 'user': 'pebbles', 'active': false } ]; // using the .matches callback shorthand .pluck(.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user'); // => ['pebbles'] // using the .matchesProperty callback shorthand .pluck(.takeRightWhile(users, 'active', false), 'user'); // => ['fred', 'pebbles'] // using the _.property callback shorthand .pluck(.takeRightWhile(users, 'active'), 'user'); // => []
    function takeRightWhile(array, predicate, thisArg) {
      return (array && array.length)
        ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)
        : [];
    }


Creates a slice of array with elements taken from the beginning. Elements are taken until predicate returns falsey. The predicate is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Array
Params
array Array The array to query.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the slice of array.
example .takeWhile([1,
2, 3], function(n) { return n < 3; }); // => [1, 2] var users = [ { 'user': 'barney', 'active': false }, { 'user': 'fred', 'active': false}, { 'user': 'pebbles', 'active': true } ]; // using the .matches callback shorthand .pluck(.takeWhile(users, { 'user': 'barney', 'active': false }), 'user'); // => ['barney'] // using the .matchesProperty callback shorthand .pluck(.takeWhile(users, 'active', false), 'user'); // => ['barney', 'fred'] // using the _.property callback shorthand .pluck(.takeWhile(users, 'active'), 'user'); // => []
    function takeWhile(array, predicate, thisArg) {
      return (array && array.length)
        ? baseWhile(array, getCallback(predicate, thisArg, 3))
        : [];
    }


Creates an array of unique values, in order, from all of the provided arrays using SameValueZero for equality comparisons.

static
memberOf
category
Array
Params
[arrays] ...Array The arrays to inspect.
Returns
Array Returns the new array of combined values.
example .union([1,
2], [4, 2], [2, 1]); // => [1, 2, 4]
    var union = restParam(function(arrays) {
      return baseUniq(baseFlatten(arrays, false, true));
    });


Creates a duplicate-free version of an array, using SameValueZero for equality comparisons, in which only the first occurence of each element is kept. Providing true for isSorted performs a faster search algorithm for sorted arrays. If an iteratee function is provided it is invoked for each element in the array to generate the criterion by which uniqueness is computed. The iteratee is bound to thisArg and invoked with three arguments: (value, index, array).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
alias
unique
category
Array
Params
array Array The array to inspect.
[isSorted] boolean Specify the array is sorted.
[iteratee] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Array Returns the new duplicate-value-free array.
example .uniq([2,
1, 2]); // => [2, 1] // using isSorted .uniq([1, 1, 2], true); // => [1, 2] // using an iteratee function .uniq([1, 2.5, 1.5, 2], function(n) { return this.floor(n); }, Math); // => [1, 2.5] // using the .property callback shorthand _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); // => [{ 'x': 1 }, { 'x': 2 }]
    function uniq(array, isSorted, iteratee, thisArg) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      if (isSorted != null && typeof isSorted != 'boolean') {
        thisArg = iteratee;
        iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;
        isSorted = false;
      }
      var callback = getCallback();
      if (!(iteratee == null && callback === baseCallback)) {
        iteratee = callback(iteratee, thisArg, 3);
      }
      return (isSorted && getIndexOf() == baseIndexOf)
        ? sortedUniq(array, iteratee)
        : baseUniq(array, iteratee);
    }


This method is like .zip except that it accepts an array of grouped elements and creates an array regrouping the elements to their pre-zip configuration.

static
memberOf
category
Array
Params
array Array The array of grouped elements to process.
Returns
Array Returns the new array of regrouped elements.
example var
zipped = .zip(['fred', 'barney'], [30, 40], [true, false]); // => [['fred', 30, true], ['barney', 40, false]] .unzip(zipped); // => [['fred', 'barney'], [30, 40], [true, false]]
    function unzip(array) {
      if (!(array && array.length)) {
        return [];
      }
      var index = -1,
          length = 0;

      array = arrayFilter(array, function(group) {
        if (isArrayLike(group)) {
          length = nativeMax(group.length, length);
          return true;
        }
      });
      var result = Array(length);
      while (++index < length) {
        result[index] = arrayMap(array, baseProperty(index));
      }
      return result;
    }


This method is like .unzip except that it accepts an iteratee to specify how regrouped values should be combined. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, index, group).

static
memberOf
category
Array
Params
array Array The array of grouped elements to process.
[iteratee] Function The function to combine regrouped values.
[thisArg] * The this binding of iteratee.
Returns
Array Returns the new array of regrouped elements.
example var
zipped = _.zip([1, 2], [10, 20], [100, 200]); // => [[1, 10, 100], [2, 20, 200]] .unzipWith(zipped, .add); // => [3, 30, 300]
    function unzipWith(array, iteratee, thisArg) {
      var length = array ? array.length : 0;
      if (!length) {
        return [];
      }
      var result = unzip(array);
      if (iteratee == null) {
        return result;
      }
      iteratee = bindCallback(iteratee, thisArg, 4);
      return arrayMap(result, function(group) {
        return arrayReduce(group, iteratee, undefined, true);
      });
    }


Creates an array excluding all provided values using SameValueZero for equality comparisons.

static
memberOf
category
Array
Params
array Array The array to filter.
[values] ...* The values to exclude.
Returns
Array Returns the new array of filtered values.
example .without([1,
2, 1, 3], 1, 2); // => [3]
    var without = restParam(function(array, values) {
      return isArrayLike(array)
        ? baseDifference(array, values)
        : [];
    });


Creates an array of unique values that is the symmetric difference of the provided arrays.

static
memberOf
category
Array
Params
[arrays] ...Array The arrays to inspect.
Returns
Array Returns the new array of values.
example .xor([1,
2], [4, 2]); // => [1, 4]
    function xor() {
      var index = -1,
          length = arguments.length;

      while (++index < length) {
        var array = arguments[index];
        if (isArrayLike(array)) {
          var result = result
            ? arrayPush(baseDifference(result, array), baseDifference(array, result))
            : array;
        }
      }
      return result ? baseUniq(result) : [];
    }


Creates an array of grouped elements, the first of which contains the first elements of the given arrays, the second of which contains the second elements of the given arrays, and so on.

static
memberOf
category
Array
Params
[arrays] ...Array The arrays to process.
Returns
Array Returns the new array of grouped elements.
example .zip(['fred',
'barney'], [30, 40], [true, false]); // => [['fred', 30, true], ['barney', 40, false]]
    var zip = restParam(unzip);


The inverse of .pairs; this method returns an object composed from arrays of property names and values. Provide either a single two dimensional array, e.g. [[key1, value1], [key2, value2]] or two arrays, one of property names and one of corresponding values.

static
memberOf
alias
object
category
Array
Params
props Array The property names.
[values=[]] Array The property values.
Returns
Object Returns the new object.
example .zipObject([['fred',
30], ['barney', 40]]); // => { 'fred': 30, 'barney': 40 } .zipObject(['fred', 'barney'], [30, 40]); // => { 'fred': 30, 'barney': 40 }
    function zipObject(props, values) {
      var index = -1,
          length = props ? props.length : 0,
          result = {};

      if (length && !values && !isArray(props[0])) {
        values = [];
      }
      while (++index < length) {
        var key = props[index];
        if (values) {
          result[key] = values[index];
        } else if (key) {
          result[key[0]] = key[1];
        }
      }
      return result;
    }


This method is like .zip except that it accepts an iteratee to specify how grouped values should be combined. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, index, group).

static
memberOf
category
Array
Params
[arrays] ...Array The arrays to process.
[iteratee] Function The function to combine grouped values.
[thisArg] * The this binding of iteratee.
Returns
Array Returns the new array of grouped elements.
example .zipWith([1,
2], [10, 20], [100, 200], .add); // => [111, 222]
    var zipWith = restParam(function(arrays) {
      var length = arrays.length,
          iteratee = length > 2 ? arrays[length - 2] : undefined,
          thisArg = length > 1 ? arrays[length - 1] : undefined;

      if (length > 2 && typeof iteratee == 'function') {
        length -= 2;
      } else {
        iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
        thisArg = undefined;
      }
      arrays.length = length;
      return unzipWith(arrays, iteratee, thisArg);
    });

    /*------------------------------------------------------------------------*/


Creates a lodash object that wraps value with explicit method chaining enabled.

static
memberOf
category
Chain
Params
value * The value to wrap.
Returns
Object Returns the new lodash wrapper instance.
example var
users = [ { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }, { 'user': 'pebbles', 'age': 1 } ]; var youngest = .chain(users) .sortBy('age') .map(function(chr) { return chr.user + ' is ' + chr.age; }) .first() .value(); // => 'pebbles is 1'
    function chain(value) {
      var result = lodash(value);
      result.__chain__ = true;
      return result;
    }


This method invokes interceptor and returns value. The interceptor is bound to thisArg and invoked with one argument; (value). The purpose of this method is to "tap into" a method chain in order to perform operations on intermediate results within the chain.

static
memberOf
category
Chain
Params
value The value to provide to interceptor.
interceptor Function The function to invoke.
[thisArg] The this binding of interceptor.
Returns
* Returns value.
example ([1,
2, 3]) .tap(function(array) { array.pop(); }) .reverse() .value(); // => [2, 1]
    function tap(value, interceptor, thisArg) {
      interceptor.call(thisArg, value);
      return value;
    }


This method is like .tap except that it returns the result of interceptor.

static
memberOf
category
Chain
Params
value The value to provide to interceptor.
interceptor Function The function to invoke.
[thisArg] The this binding of interceptor.
Returns
* Returns the result of interceptor.
example _('
abc ') .chain() .trim() .thru(function(value) { return [value]; }) .value(); // => ['abc']
    function thru(value, interceptor, thisArg) {
      return interceptor.call(thisArg, value);
    }


Enables explicit method chaining on the wrapper object.

name
chain
memberOf
category
Chain
Returns
Object Returns the new lodash wrapper instance.
example var
users = [ { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 } ]; // without explicit chaining (users).first(); // => { 'user': 'barney', 'age': 36 } // with explicit chaining _(users).chain() .first() .pick('user') .value(); // => { 'user': 'barney' }
    function wrapperChain() {
      return chain(this);
    }


Executes the chained sequence and returns the wrapped result.

name
commit
memberOf
category
Chain
Returns
Object Returns the new lodash wrapper instance.
example var
array = [1, 2]; var wrapped = (array).push(3); console.log(array); // => [1, 2] wrapped = wrapped.commit(); console.log(array); // => [1, 2, 3] wrapped.last(); // => 3 console.log(array); // => [1, 2, 3]
    function wrapperCommit() {
      return new LodashWrapper(this.value(), this.__chain__);
    }


Creates a new array joining a wrapped array with any additional arrays and/or values.

name
concat
memberOf
category
Chain
Params
[values] ...* The values to concatenate.
Returns
Array Returns the new concatenated array.
example var
array = [1]; var wrapped = (array).concat(2, [3], [[4]]); console.log(wrapped.value()); // => [1, 2, 3, [4]] console.log(array); // => [1]
    var wrapperConcat = restParam(function(values) {
      values = baseFlatten(values);
      return this.thru(function(array) {
        return arrayConcat(isArray(array) ? array : [toObject(array)], values);
      });
    });


Creates a clone of the chained sequence planting value as the wrapped value.

name
plant
memberOf
category
Chain
Returns
Object Returns the new lodash wrapper instance.
example var
array = [1, 2]; var wrapped = (array).map(function(value) { return Math.pow(value, 2); }); var other = [3, 4]; var otherWrapped = wrapped.plant(other); otherWrapped.value(); // => [9, 16] wrapped.value(); // => [1, 4]
    function wrapperPlant(value) {
      var result,
          parent = this;

      while (parent instanceof baseLodash) {
        var clone = wrapperClone(parent);
        if (result) {
          previous.__wrapped__ = clone;
        } else {
          result = clone;
        }
        var previous = clone;
        parent = parent.__wrapped__;
      }
      previous.__wrapped__ = value;
      return result;
    }


Reverses the wrapped array so the first element becomes the last, the second element becomes the second to last, and so on.

Note: This method mutates the wrapped array.

name
reverse
memberOf
category
Chain
Returns
Object Returns the new reversed lodash wrapper instance.
example var
array = [1, 2, 3]; (array).reverse().value() // => [3, 2, 1] console.log(array); // => [3, 2, 1]
    function wrapperReverse() {
      var value = this.__wrapped__;

      var interceptor = function(value) {
        return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse();
      };
      if (value instanceof LazyWrapper) {
        var wrapped = value;
        if (this.__actions__.length) {
          wrapped = new LazyWrapper(this);
        }
        wrapped = wrapped.reverse();
        wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
        return new LodashWrapper(wrapped, this.__chain__);
      }
      return this.thru(interceptor);
    }


Produces the result of coercing the unwrapped value to a string.

name
toString
memberOf
category
Chain
Returns
string Returns the coerced string value.
example ([1,
2, 3]).toString(); // => '1,2,3'
    function wrapperToString() {
      return (this.value() + '');
    }


Executes the chained sequence to extract the unwrapped value.

name
value
memberOf
alias
run, toJSON, valueOf
category
Chain
Returns
* Returns the resolved unwrapped value.
example ([1,
2, 3]).value(); // => [1, 2, 3]
    function wrapperValue() {
      return baseWrapperValue(this.__wrapped__, this.__actions__);
    }

    /*------------------------------------------------------------------------*/


Creates an array of elements corresponding to the given keys, or indexes, of collection. Keys may be specified as individual arguments or as arrays of keys.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[props] ...(number number[] string string[]) The property names or indexes of elements to pick, specified individually or in arrays.
Returns
Array Returns the new array of picked elements.
example .at(['a',
'b', 'c'], [0, 2]); // => ['a', 'c'] _.at(['barney', 'fred', 'pebbles'], 0, 2); // => ['barney', 'pebbles']
    var at = restParam(function(collection, props) {
      return baseAt(collection, baseFlatten(props));
    });


Creates an object composed of keys generated from the results of running each element of collection through iteratee. The corresponding value of each key is the number of times the key was returned by iteratee. The iteratee is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns the composed aggregate object.
example .countBy([4.3,
6.1, 6.4], function(n) { return Math.floor(n); }); // => { '4': 1, '6': 2 } .countBy([4.3, 6.1, 6.4], function(n) { return this.floor(n); }, Math); // => { '4': 1, '6': 2 } .countBy(['one', 'two', 'three'], 'length'); // => { '3': 2, '5': 1 }
    var countBy = createAggregator(function(result, value, key) {
      hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
    });


Checks if predicate returns truthy for all elements of collection. The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
alias
all
category
Collection
Params
collection Array Object string The collection to iterate over.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
boolean Returns true if all elements pass the predicate check, else false.
example .every([true,
1, null, 'yes'], Boolean); // => false var users = [ { 'user': 'barney', 'active': false }, { 'user': 'fred', 'active': false } ]; // using the .matches callback shorthand .every(users, { 'user': 'barney', 'active': false }); // => false // using the .matchesProperty callback shorthand .every(users, 'active', false); // => true // using the .property callback shorthand .every(users, 'active'); // => false
    function every(collection, predicate, thisArg) {
      var func = isArray(collection) ? arrayEvery : baseEvery;
      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
        predicate = undefined;
      }
      if (typeof predicate != 'function' || thisArg !== undefined) {
        predicate = getCallback(predicate, thisArg, 3);
      }
      return func(collection, predicate);
    }


Iterates over elements of collection, returning an array of all elements predicate returns truthy for. The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
alias
select
category
Collection
Params
collection Array Object string The collection to iterate over.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the new filtered array.
example .filter([4,
5, 6], function(n) { return n % 2 == 0; }); // => [4, 6] var users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false } ]; // using the .matches callback shorthand .pluck(.filter(users, { 'age': 36, 'active': true }), 'user'); // => ['barney'] // using the .matchesProperty callback shorthand .pluck(.filter(users, 'active', false), 'user'); // => ['fred'] // using the _.property callback shorthand .pluck(.filter(users, 'active'), 'user'); // => ['barney']
    function filter(collection, predicate, thisArg) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      predicate = getCallback(predicate, thisArg, 3);
      return func(collection, predicate);
    }


Iterates over elements of collection, returning the first element predicate returns truthy for. The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
alias
detect
category
Collection
Params
collection Array Object string The collection to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] The this binding of predicate.
Returns
Returns the matched element, else undefined.
example var
users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 1, 'active': true } ]; .result(.find(users, function(chr) { return chr.age < 40; }), 'user'); // => 'barney' // using the .matches callback shorthand .result(.find(users, { 'age': 1, 'active': true }), 'user'); // => 'pebbles' // using the .matchesProperty callback shorthand .result(.find(users, 'active', false), 'user'); // => 'fred' // using the .property callback shorthand .result(.find(users, 'active'), 'user'); // => 'barney'
    var find = createFind(baseEach);


This method is like .find except that it iterates over elements of collection from right to left.

static
memberOf
category
Collection
Params
collection Array Object string The collection to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] The this binding of predicate.
Returns
Returns the matched element, else undefined.
example .findLast([1,
2, 3, 4], function(n) { return n % 2 == 1; }); // => 3
    var findLast = createFind(baseEachRight, true);


Performs a deep comparison between each element in collection and the source object, returning the first element that has equivalent property values.

Note: This method supports comparing arrays, booleans, Date objects, numbers, Object objects, regexes, and strings. Objects are compared by their own, not inherited, enumerable properties. For comparing a single own or inherited property value see .matchesProperty.

static
memberOf
category
Collection
Params
collection Array Object string The collection to search.
source Object The object of property values to match.
Returns
* Returns the matched element, else undefined.
example var
users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false } ]; .result(.findWhere(users, { 'age': 36, 'active': true }), 'user'); // => 'barney' .result(.findWhere(users, { 'age': 40, 'active': false }), 'user'); // => 'fred'
    function findWhere(collection, source) {
      return find(collection, baseMatches(source));
    }


Iterates over elements of collection invoking iteratee for each element. The iteratee is bound to thisArg and invoked with three arguments: (value, index|key, collection). Iteratee functions may exit iteration early by explicitly returning false.

Note: As with other "Collections" methods, objects with a "length" property are iterated like arrays. To avoid this behavior .forIn or .forOwn may be used for object iteration.

static
memberOf
alias
each
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Array Object string Returns collection.
example ([1,
2]).forEach(function(n) { console.log(n); }).value(); // => logs each value from left to right and returns the array .forEach({ 'a': 1, 'b': 2 }, function(n, key) { console.log(n, key); }); // => logs each value-key pair and returns the object (iteration order is not guaranteed)
    var forEach = createForEach(arrayEach, baseEach);


This method is like .forEach except that it iterates over elements of collection from right to left.

static
memberOf
alias
eachRight
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Array Object string Returns collection.
example ([1,
2]).forEachRight(function(n) { console.log(n); }).value(); // => logs each value from right to left and returns the array
    var forEachRight = createForEach(arrayEachRight, baseEachRight);


Creates an object composed of keys generated from the results of running each element of collection through iteratee. The corresponding value of each key is an array of the elements responsible for generating the key. The iteratee is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns the composed aggregate object.
example .groupBy([4.2,
6.1, 6.4], function(n) { return Math.floor(n); }); // => { '4': [4.2], '6': [6.1, 6.4] } .groupBy([4.2, 6.1, 6.4], function(n) { return this.floor(n); }, Math); // => { '4': [4.2], '6': [6.1, 6.4] } // using the .property callback shorthand _.groupBy(['one', 'two', 'three'], 'length'); // => { '3': ['one', 'two'], '5': ['three'] }
    var groupBy = createAggregator(function(result, value, key) {
      if (hasOwnProperty.call(result, key)) {
        result[key].push(value);
      } else {
        result[key] = [value];
      }
    });


Checks if value is in collection using SameValueZero for equality comparisons. If fromIndex is negative, it is used as the offset from the end of collection.

static
memberOf
alias
contains, include
category
Collection
Params
collection Array Object string The collection to search.
target * The value to search for.
[fromIndex=0] number The index to search from.
param-
Object [guard] Enables use as a callback for functions like .reduce.
Returns
boolean Returns true if a matching element is found, else false.
example .includes([1,
2, 3], 1); // => true .includes([1, 2, 3], 1, 2); // => false .includes({ 'user': 'fred', 'age': 40 }, 'fred'); // => true .includes('pebbles', 'eb'); // => true
    function includes(collection, target, fromIndex, guard) {
      var length = collection ? getLength(collection) : 0;
      if (!isLength(length)) {
        collection = values(collection);
        length = collection.length;
      }
      if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
        fromIndex = 0;
      } else {
        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
      }
      return (typeof collection == 'string' || !isArray(collection) && isString(collection))
        ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)
        : (!!length && getIndexOf(collection, target, fromIndex) > -1);
    }


Creates an object composed of keys generated from the results of running each element of collection through iteratee. The corresponding value of each key is the last element responsible for generating the key. The iteratee function is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns the composed aggregate object.
example var
keyData = [ { 'dir': 'left', 'code': 97 }, { 'dir': 'right', 'code': 100 } ]; .indexBy(keyData, 'dir'); // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } .indexBy(keyData, function(object) { return String.fromCharCode(object.code); }); // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } .indexBy(keyData, function(object) { return this.fromCharCode(object.code); }, String); // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
    var indexBy = createAggregator(function(result, value, key) {
      result[key] = value;
    });


Invokes the method at path of each element in collection, returning an array of the results of each invoked method. Any additional arguments are provided to each invoked method. If methodName is a function it is invoked for, and this bound to, each element in collection.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
path Array Function string The path of the method to invoke or the function invoked per iteration.
[args] ...* The arguments to invoke the method with.
Returns
Array Returns the array of results.
example .invoke([[5,
1, 7], [3, 2, 1]], 'sort'); // => [[1, 5, 7], [1, 2, 3]] _.invoke([123, 456], String.prototype.split, ''); // => [['1', '2', '3'], ['4', '5', '6']]
    var invoke = restParam(function(collection, path, args) {
      var index = -1,
          isFunc = typeof path == 'function',
          isProp = isKey(path),
          result = isArrayLike(collection) ? Array(collection.length) : [];

      baseEach(collection, function(value) {
        var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);
        result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
      });
      return result;
    });


Creates an array of values by running each element in collection through iteratee. The iteratee is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

Many lodash methods are guarded to work as iteratees for methods like .every, .filter, .map, .mapValues, .reject, and .some.

The guarded methods are: ary, callback, chunk, clone, create, curry, curryRight, drop, dropRight, every, fill, flatten, invert, max, min, parseInt, slice, sortBy, take, takeRight, template, trim, trimLeft, trimRight, trunc, random, range, sample, some, sum, uniq, and words

static
memberOf
alias
collect
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] The this binding of iteratee.
Returns
Array Returns the new mapped array.
example function
timesThree(n) { return n 3; } .map([1, 2], timesThree); // => [3, 6] .map({ 'a': 1, 'b': 2 }, timesThree); // => [3, 6] (iteration order is not guaranteed) var users = [ { 'user': 'barney' }, { 'user': 'fred' } ]; // using the .property callback shorthand _.map(users, 'user'); // => ['barney', 'fred']
    function map(collection, iteratee, thisArg) {
      var func = isArray(collection) ? arrayMap : baseMap;
      iteratee = getCallback(iteratee, thisArg, 3);
      return func(collection, iteratee);
    }


Creates an array of elements split into two groups, the first of which contains elements predicate returns truthy for, while the second of which contains elements predicate returns falsey for. The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the array of grouped elements.
example .partition([1,
2, 3], function(n) { return n % 2; }); // => [[1, 3], [2]] .partition([1.2, 2.3, 3.4], function(n) { return this.floor(n) % 2; }, Math); // => [[1.2, 3.4], [2.3]] var users = [ { 'user': 'barney', 'age': 36, 'active': false }, { 'user': 'fred', 'age': 40, 'active': true }, { 'user': 'pebbles', 'age': 1, 'active': false } ]; var mapper = function(array) { return .pluck(array, 'user'); }; // using the .matches callback shorthand .map(.partition(users, { 'age': 1, 'active': false }), mapper); // => [['pebbles'], ['barney', 'fred']] // using the .matchesProperty callback shorthand .map(.partition(users, 'active', false), mapper); // => [['barney', 'pebbles'], ['fred']] // using the _.property callback shorthand .map(.partition(users, 'active'), mapper); // => [['fred'], ['barney', 'pebbles']]
    var partition = createAggregator(function(result, value, key) {
      result[key ? 0 : 1].push(value);
    }, function() { return [[], []]; });


Gets the property value of path from all elements in collection.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
path Array string The path of the property to pluck.
Returns
Array Returns the property values.
example var
users = [ { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 } ]; .pluck(users, 'user'); // => ['barney', 'fred'] var userIndex = .indexBy(users, 'user'); .pluck(userIndex, 'age'); // => [36, 40] (iteration order is not guaranteed)
    function pluck(collection, path) {
      return map(collection, property(path));
    }


Reduces collection to a value which is the accumulated result of running each element in collection through iteratee, where each successive invocation is supplied the return value of the previous. If accumulator is not provided the first element of collection is used as the initial value. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, index|key, collection).

Many lodash methods are guarded to work as iteratees for methods like .reduce, .reduceRight, and .transform.

The guarded methods are: assign, defaults, defaultsDeep, includes, merge, sortByAll, and sortByOrder

static
memberOf
alias
foldl, inject
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[accumulator] The initial value.
[thisArg] The this binding of iteratee.
Returns
* Returns the accumulated value.
example .reduce([1,
2], function(total, n) { return total + n; }); // => 3 _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) { result[key] = n * 3; return result; }, {}); // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
    var reduce = createReduce(arrayReduce, baseEach);


This method is like .reduce except that it iterates over elements of collection from right to left.

static
memberOf
alias
foldr
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[accumulator] The initial value.
[thisArg] The this binding of iteratee.
Returns
* Returns the accumulated value.
example var
array = [[0, 1], [2, 3], [4, 5]]; .reduceRight(array, function(flattened, other) { return flattened.concat(other); }, []); // => [4, 5, 2, 3, 0, 1]
    var reduceRight = createReduce(arrayReduceRight, baseEachRight);


The opposite of .filter; this method returns the elements of collection that predicate does not return truthy for.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
Array Returns the new filtered array.
example .reject([1,
2, 3, 4], function(n) { return n % 2 == 0; }); // => [1, 3] var users = [ { 'user': 'barney', 'age': 36, 'active': false }, { 'user': 'fred', 'age': 40, 'active': true } ]; // using the .matches callback shorthand .pluck(.reject(users, { 'age': 40, 'active': true }), 'user'); // => ['barney'] // using the .matchesProperty callback shorthand .pluck(.reject(users, 'active', false), 'user'); // => ['fred'] // using the _.property callback shorthand .pluck(.reject(users, 'active'), 'user'); // => ['barney']
    function reject(collection, predicate, thisArg) {
      var func = isArray(collection) ? arrayFilter : baseFilter;
      predicate = getCallback(predicate, thisArg, 3);
      return func(collection, function(value, index, collection) {
        return !predicate(value, index, collection);
      });
    }


Gets a random element or n random elements from a collection.

static
memberOf
category
Collection
Params
collection Array Object string The collection to sample.
[n] number The number of elements to sample.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
* Returns the random sample(s).
example .sample([1,
2, 3, 4]); // => 2 .sample([1, 2, 3, 4], 2); // => [3, 1]
    function sample(collection, n, guard) {
      if (guard ? isIterateeCall(collection, n, guard) : n == null) {
        collection = toIterable(collection);
        var length = collection.length;
        return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
      }
      var index = -1,
          result = toArray(collection),
          length = result.length,
          lastIndex = length - 1;

      n = nativeMin(n < 0 ? 0 : (+n || 0), length);
      while (++index < n) {
        var rand = baseRandom(index, lastIndex),
            value = result[rand];

        result[rand] = result[index];
        result[index] = value;
      }
      result.length = n;
      return result;
    }


Creates an array of shuffled values, using a version of the Fisher-Yates shuffle.

static
memberOf
category
Collection
Params
collection Array Object string The collection to shuffle.
Returns
Array Returns the new shuffled array.
example .shuffle([1,
2, 3, 4]); // => [4, 1, 3, 2]
    function shuffle(collection) {
      return sample(collection, POSITIVE_INFINITY);
    }


Gets the size of collection by returning its length for array-like values or the number of own enumerable properties for objects.

static
memberOf
category
Collection
Params
collection Array Object string The collection to inspect.
Returns
number Returns the size of collection.
example .size([1,
2, 3]); // => 3 .size({ 'a': 1, 'b': 2 }); // => 2 .size('pebbles'); // => 7
    function size(collection) {
      var length = collection ? getLength(collection) : 0;
      return isLength(length) ? length : keys(collection).length;
    }


Checks if predicate returns truthy for any element of collection. The function returns as soon as it finds a passing value and does not iterate over the entire collection. The predicate is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
alias
any
category
Collection
Params
collection Array Object string The collection to iterate over.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
boolean Returns true if any element passes the predicate check, else false.
example .some([null,
0, 'yes', false], Boolean); // => true var users = [ { 'user': 'barney', 'active': true }, { 'user': 'fred', 'active': false } ]; // using the .matches callback shorthand .some(users, { 'user': 'barney', 'active': false }); // => false // using the .matchesProperty callback shorthand .some(users, 'active', false); // => true // using the .property callback shorthand .some(users, 'active'); // => true
    function some(collection, predicate, thisArg) {
      var func = isArray(collection) ? arraySome : baseSome;
      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
        predicate = undefined;
      }
      if (typeof predicate != 'function' || thisArg !== undefined) {
        predicate = getCallback(predicate, thisArg, 3);
      }
      return func(collection, predicate);
    }


Creates an array of elements, sorted in ascending order by the results of running each element in a collection through iteratee. This method performs a stable sort, that is, it preserves the original sort order of equal elements. The iteratee is bound to thisArg and invoked with three arguments: (value, index|key, collection).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Array Returns the new sorted array.
example .sortBy([1,
2, 3], function(n) { return Math.sin(n); }); // => [3, 1, 2] .sortBy([1, 2, 3], function(n) { return this.sin(n); }, Math); // => [3, 1, 2] var users = [ { 'user': 'fred' }, { 'user': 'pebbles' }, { 'user': 'barney' } ]; // using the .property callback shorthand .pluck(.sortBy(users, 'user'), 'user'); // => ['barney', 'fred', 'pebbles']
    function sortBy(collection, iteratee, thisArg) {
      if (collection == null) {
        return [];
      }
      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
        iteratee = undefined;
      }
      var index = -1;
      iteratee = getCallback(iteratee, thisArg, 3);

      var result = baseMap(collection, function(value, key, collection) {
        return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
      });
      return baseSortBy(result, compareAscending);
    }


This method is like .sortBy except that it can sort by multiple iteratees or property names.

If a property name is provided for an iteratee the created .property style callback returns the property value of the given element.

If an object is provided for an iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
iteratees ...(Function Function[] Object Object[] string string[]) The iteratees to sort by, specified as individual values or arrays of values.
Returns
Array Returns the new sorted array.
example var
users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 42 }, { 'user': 'barney', 'age': 34 } ]; .map(.sortByAll(users, ['user', 'age']), .values); // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]] .map(.sortByAll(users, 'user', function(chr) { return Math.floor(chr.age / 10); }), .values); // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
    var sortByAll = restParam(function(collection, iteratees) {
      if (collection == null) {
        return [];
      }
      var guard = iteratees[2];
      if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
        iteratees.length = 1;
      }
      return baseSortByOrder(collection, baseFlatten(iteratees), []);
    });


This method is like .sortByAll except that it allows specifying the sort orders of the iteratees to sort by. If orders is unspecified, all values are sorted in ascending order. Otherwise, a value is sorted in ascending order if its corresponding order is "asc", and descending if "desc".

If a property name is provided for an iteratee the created .property style callback returns the property value of the given element.

If an object is provided for an iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Collection
Params
collection Array Object string The collection to iterate over.
iteratees Function[] Object[] string[] The iteratees to sort by.
[orders] boolean[] The sort orders of iteratees.
param-
Object [guard] Enables use as a callback for functions like .reduce.
Returns
Array Returns the new sorted array.
example var
users = [ { 'user': 'fred', 'age': 48 }, { 'user': 'barney', 'age': 34 }, { 'user': 'fred', 'age': 42 }, { 'user': 'barney', 'age': 36 } ]; // sort by user in ascending order and by age in descending order .map(.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), .values); // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
    function sortByOrder(collection, iteratees, orders, guard) {
      if (collection == null) {
        return [];
      }
      if (guard && isIterateeCall(iteratees, orders, guard)) {
        orders = undefined;
      }
      if (!isArray(iteratees)) {
        iteratees = iteratees == null ? [] : [iteratees];
      }
      if (!isArray(orders)) {
        orders = orders == null ? [] : [orders];
      }
      return baseSortByOrder(collection, iteratees, orders);
    }


Performs a deep comparison between each element in collection and the source object, returning an array of all elements that have equivalent property values.

Note: This method supports comparing arrays, booleans, Date objects, numbers, Object objects, regexes, and strings. Objects are compared by their own, not inherited, enumerable properties. For comparing a single own or inherited property value see .matchesProperty.

static
memberOf
category
Collection
Params
collection Array Object string The collection to search.
source Object The object of property values to match.
Returns
Array Returns the new filtered array.
example var
users = [ { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] }, { 'user': 'fred', 'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] } ]; .pluck(.where(users, { 'age': 36, 'active': false }), 'user'); // => ['barney'] .pluck(.where(users, { 'pets': ['dino'] }), 'user'); // => ['fred']
    function where(collection, source) {
      return filter(collection, baseMatches(source));
    }

    /*------------------------------------------------------------------------*/


Gets the number of milliseconds that have elapsed since the Unix epoch (1 January 1970 00:00:00 UTC).

static
memberOf
category
Date
example .defer(function(stamp)
console.log(_.now()-stamp); { console.log(.now()-stamp); }, .now()); // => logs the number of milliseconds it took for the deferred function to be invoked
    var now = nativeNow || function() {
      return new Date().getTime();
    };

    /*------------------------------------------------------------------------*/


The opposite of .before; this method creates a function that invokes func once it is called n or more times.

static
memberOf
category
Function
Params
n number The number of calls before func is invoked.
func Function The function to restrict.
Returns
Function Returns the new restricted function.
example var
saves = ['profile', 'settings']; var done = .after(saves.length, function() { console.log('done saving!'); }); .forEach(saves, function(type) { asyncSave({ 'type': type, 'complete': done }); }); // => logs 'done saving!' after the two async saves have completed
    function after(n, func) {
      if (typeof func != 'function') {
        if (typeof n == 'function') {
          var temp = n;
          n = func;
          func = temp;
        } else {
          throw new TypeError(FUNC_ERROR_TEXT);
        }
      }
      n = nativeIsFinite(n = +n) ? n : 0;
      return function() {
        if (--n < 1) {
          return func.apply(this, arguments);
        }
      };
    }


Creates a function that accepts up to n arguments ignoring any additional arguments.

static
memberOf
category
Function
Params
func Function The function to cap arguments for.
[n=func.length] number The arity cap.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Function Returns the new function.
example .map(['6',
'8', '10'], .ary(parseInt, 1)); // => [6, 8, 10]
    function ary(func, n, guard) {
      if (guard && isIterateeCall(func, n, guard)) {
        n = undefined;
      }
      n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);
      return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
    }


Creates a function that invokes func, with the this binding and arguments of the created function, while it is called less than n times. Subsequent calls to the created function return the result of the last func invocation.

static
memberOf
category
Function
Params
n number The number of calls at which func is no longer invoked.
func Function The function to restrict.
Returns
Function Returns the new restricted function.
example jQuery('#add').on('click',
.before(5, addContactToList)); // => allows adding up to 4 contacts to the list
    function before(n, func) {
      var result;
      if (typeof func != 'function') {
        if (typeof n == 'function') {
          var temp = n;
          n = func;
          func = temp;
        } else {
          throw new TypeError(FUNC_ERROR_TEXT);
        }
      }
      return function() {
        if (--n > 0) {
          result = func.apply(this, arguments);
        }
        if (n <= 1) {
          func = undefined;
        }
        return result;
      };
    }


Creates a function that invokes func with the this binding of thisArg and prepends any additional .bind arguments to those provided to the bound function.

The .bind.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for partially applied arguments.

Note: Unlike native Function#bind this method does not set the "length" property of bound functions.

static
memberOf
category
Function
Params
func Function The function to bind.
thisArg The this binding of func.
[partials] ... The arguments to be partially applied.
Returns
Function Returns the new bound function.
example var
greet = function(greeting, punctuation) { return greeting + ' ' + this.user + punctuation; }; var object = { 'user': 'fred' }; var bound = _.bind(greet, object, 'hi'); bound('!'); // => 'hi fred!' // using placeholders var bound = .bind(greet, object, , '!'); bound('hi'); // => 'hi fred!'
    var bind = restParam(function(func, thisArg, partials) {
      var bitmask = BIND_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, bind.placeholder);
        bitmask |= PARTIAL_FLAG;
      }
      return createWrapper(func, bitmask, thisArg, partials, holders);
    });


Binds methods of an object to the object itself, overwriting the existing method. Method names may be specified as individual arguments or as arrays of method names. If no method names are provided all enumerable function properties, own and inherited, of object are bound.

Note: This method does not set the "length" property of bound functions.

static
memberOf
category
Function
Params
object Object The object to bind and assign the bound methods to.
[methodNames] ...(string string[]) The object method names to bind, specified as individual method names or arrays of method names.
Returns
Object Returns object.
example var
view = { 'label': 'docs', 'onClick': function() { console.log('clicked ' + this.label); } }; .bindAll(view); jQuery('#docs').on('click', view.onClick); // => logs 'clicked docs' when the element is clicked
    var bindAll = restParam(function(object, methodNames) {
      methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);

      var index = -1,
          length = methodNames.length;

      while (++index < length) {
        var key = methodNames[index];
        object[key] = createWrapper(object[key], BIND_FLAG, object);
      }
      return object;
    });


Creates a function that invokes the method at object[key] and prepends any additional .bindKey arguments to those provided to the bound function.

This method differs from .bind by allowing bound functions to reference methods that may be redefined or don't yet exist. See Peter Michaux's article for more details.

The .bindKey.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for partially applied arguments.

static
memberOf
category
Function
Params
object Object The object the method belongs to.
key string The key of the method.
[partials] ...* The arguments to be partially applied.
Returns
Function Returns the new bound function.
example var
object = { 'user': 'fred', 'greet': function(greeting, punctuation) { return greeting + ' ' + this.user + punctuation; } }; var bound = .bindKey(object, 'greet', 'hi'); bound('!'); // => 'hi fred!' object.greet = function(greeting, punctuation) { return greeting + 'ya ' + this.user + punctuation; }; bound('!'); // => 'hiya fred!' // using placeholders var bound = .bindKey(object, 'greet', , '!'); bound('hi'); // => 'hiya fred!'
    var bindKey = restParam(function(object, key, partials) {
      var bitmask = BIND_FLAG | BIND_KEY_FLAG;
      if (partials.length) {
        var holders = replaceHolders(partials, bindKey.placeholder);
        bitmask |= PARTIAL_FLAG;
      }
      return createWrapper(key, bitmask, object, partials, holders);
    });


Creates a function that accepts one or more arguments of func that when called either invokes func returning its result, if all func arguments have been provided, or returns a function that accepts one or more of the remaining func arguments, and so on. The arity of func may be specified if func.length is not sufficient.

The .curry.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for provided arguments.

Note: This method does not set the "length" property of curried functions.

static
memberOf
category
Function
Params
func Function The function to curry.
[arity=func.length] number The arity of func.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Function Returns the new curried function.
example var
abc = function(a, b, c) { return [a, b, c]; }; var curried = .curry(abc); curried(1)(2)(3); // => [1, 2, 3] curried(1, 2)(3); // => [1, 2, 3] curried(1, 2, 3); // => [1, 2, 3] // using placeholders curried(1)(, 3)(2); // => [1, 2, 3]
    var curry = createCurry(CURRY_FLAG);


This method is like .curry except that arguments are applied to func in the manner of .partialRight instead of .partial.

The .curryRight.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for provided arguments.

Note: This method does not set the "length" property of curried functions.

static
memberOf
category
Function
Params
func Function The function to curry.
[arity=func.length] number The arity of func.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Function Returns the new curried function.
example var
abc = function(a, b, c) { return [a, b, c]; }; var curried = .curryRight(abc); curried(3)(2)(1); // => [1, 2, 3] curried(2, 3)(1); // => [1, 2, 3] curried(1, 2, 3); // => [1, 2, 3] // using placeholders curried(3)(1, _)(2); // => [1, 2, 3]
    var curryRight = createCurry(CURRY_RIGHT_FLAG);


Creates a debounced function that delays invoking func until after wait milliseconds have elapsed since the last time the debounced function was invoked. The debounced function comes with a cancel method to cancel delayed invocations. Provide an options object to indicate that func should be invoked on the leading and/or trailing edge of the wait timeout. Subsequent calls to the debounced function return the result of the last func invocation.

Note: If leading and trailing options are true, func is invoked on the trailing edge of the timeout only if the the debounced function is invoked more than once during the wait timeout.

See David Corbacho's article for details over the differences between .debounce and .throttle.

static
memberOf
category
Function
Params
func Function The function to debounce.
[wait=0] number The number of milliseconds to delay.
[options] Object The options object.
[options.leading=false] boolean Specify invoking on the leading edge of the timeout.
[options.maxWait] number The maximum time func is allowed to be delayed before it is invoked.
[options.trailing=true] boolean Specify invoking on the trailing edge of the timeout.
Returns
Function Returns the new debounced function.
example //
avoid costly calculations while the window size is in flux jQuery(window).on('resize', .debounce(calculateLayout, 150)); // invoke sendMail when the click event is fired, debouncing subsequent calls jQuery('#postbox').on('click', .debounce(sendMail, 300, { 'leading': true, 'trailing': false })); // ensure batchLog is invoked once after 1 second of debounced calls var source = new EventSource('/stream'); jQuery(source).on('message', .debounce(batchLog, 250, { 'maxWait': 1000 })); // cancel a debounced call var todoChanges = .debounce(batchLog, 1000); Object.observe(models.todo, todoChanges); Object.observe(models, function(changes) { if (.find(changes, { 'user': 'todo', 'type': 'delete'})) { todoChanges.cancel(); } }, ['delete']); // ...at some point models.todo is changed models.todo.completed = true; // ...before 1 second has passed models.todo is deleted // which cancels the debounced todoChanges call delete models.todo;
    function debounce(func, wait, options) {
      var args,
          maxTimeoutId,
          result,
          stamp,
          thisArg,
          timeoutId,
          trailingCall,
          lastCalled = 0,
          maxWait = false,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      wait = wait < 0 ? 0 : (+wait || 0);
      if (options === true) {
        var leading = true;
        trailing = false;
      } else if (isObject(options)) {
        leading = !!options.leading;
        maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }

      function cancel() {
        if (timeoutId) {
          clearTimeout(timeoutId);
        }
        if (maxTimeoutId) {
          clearTimeout(maxTimeoutId);
        }
        lastCalled = 0;
        maxTimeoutId = timeoutId = trailingCall = undefined;
      }

      function complete(isCalled, id) {
        if (id) {
          clearTimeout(id);
        }
        maxTimeoutId = timeoutId = trailingCall = undefined;
        if (isCalled) {
          lastCalled = now();
          result = func.apply(thisArg, args);
          if (!timeoutId && !maxTimeoutId) {
            args = thisArg = undefined;
          }
        }
      }

      function delayed() {
        var remaining = wait - (now() - stamp);
        if (remaining <= 0 || remaining > wait) {
          complete(trailingCall, maxTimeoutId);
        } else {
          timeoutId = setTimeout(delayed, remaining);
        }
      }

      function maxDelayed() {
        complete(trailing, timeoutId);
      }

      function debounced() {
        args = arguments;
        stamp = now();
        thisArg = this;
        trailingCall = trailing && (timeoutId || !leading);

        if (maxWait === false) {
          var leadingCall = leading && !timeoutId;
        } else {
          if (!maxTimeoutId && !leading) {
            lastCalled = stamp;
          }
          var remaining = maxWait - (stamp - lastCalled),
              isCalled = remaining <= 0 || remaining > maxWait;

          if (isCalled) {
            if (maxTimeoutId) {
              maxTimeoutId = clearTimeout(maxTimeoutId);
            }
            lastCalled = stamp;
            result = func.apply(thisArg, args);
          }
          else if (!maxTimeoutId) {
            maxTimeoutId = setTimeout(maxDelayed, remaining);
          }
        }
        if (isCalled && timeoutId) {
          timeoutId = clearTimeout(timeoutId);
        }
        else if (!timeoutId && wait !== maxWait) {
          timeoutId = setTimeout(delayed, wait);
        }
        if (leadingCall) {
          isCalled = true;
          result = func.apply(thisArg, args);
        }
        if (isCalled && !timeoutId && !maxTimeoutId) {
          args = thisArg = undefined;
        }
        return result;
      }
      debounced.cancel = cancel;
      return debounced;
    }


Defers invoking the func until the current call stack has cleared. Any additional arguments are provided to func when it is invoked.

static
memberOf
category
Function
Params
func Function The function to defer.
[args] ...* The arguments to invoke the function with.
Returns
number Returns the timer id.
example .defer(function(text)
console.log(text); { console.log(text); }, 'deferred'); // logs 'deferred' after one or more milliseconds
    var defer = restParam(function(func, args) {
      return baseDelay(func, 1, args);
    });


Invokes func after wait milliseconds. Any additional arguments are provided to func when it is invoked.

static
memberOf
category
Function
Params
func Function The function to delay.
wait number The number of milliseconds to delay invocation.
[args] ...* The arguments to invoke the function with.
Returns
number Returns the timer id.
example .delay(function(text)
console.log(text); { console.log(text); }, 1000, 'later'); // => logs 'later' after one second
    var delay = restParam(function(func, wait, args) {
      return baseDelay(func, wait, args);
    });


Creates a function that returns the result of invoking the provided functions with the this binding of the created function, where each successive invocation is supplied the return value of the previous.

static
memberOf
_
category
Function
Params
[funcs] ...Function Functions to invoke.
Returns
Function Returns the new function.
example function
square(n) { return n * n; } var addSquare = .flow(.add, square); addSquare(1, 2); // => 9
    var flow = createFlow();


This method is like .flow except that it creates a function that invokes the provided functions from right to left.

static
memberOf
alias
backflow, compose
category
Function
Params
[funcs] ...Function Functions to invoke.
Returns
Function Returns the new function.
example function
square(n) { return n * n; } var addSquare = .flowRight(square, .add); addSquare(1, 2); // => 9
    var flowRight = createFlow(true);


Creates a function that memoizes the result of func. If resolver is provided it determines the cache key for storing the result based on the arguments provided to the memoized function. By default, the first argument provided to the memoized function is coerced to a string and used as the cache key. The func is invoked with the this binding of the memoized function.

Note: The cache is exposed as the cache property on the memoized function. Its creation may be customized by replacing the .memoize.Cache constructor with one whose instances implement the Map method interface of get, has, and set.

static
memberOf
category
Function
Params
func Function The function to have its output memoized.
[resolver] Function The function to resolve the cache key.
Returns
Function Returns the new memoizing function.
example var
upperCase = .memoize(function(string) { return string.toUpperCase(); }); upperCase('fred'); // => 'FRED' // modifying the result cache upperCase.cache.set('fred', 'BARNEY'); upperCase('fred'); // => 'BARNEY' // replacing .memoize.Cache var object = { 'user': 'fred' }; var other = { 'user': 'barney' }; var identity = .memoize(.identity); identity(object); // => { 'user': 'fred' } identity(other); // => { 'user': 'fred' } .memoize.Cache = WeakMap; var identity = .memoize(_.identity); identity(object); // => { 'user': 'fred' } identity(other); // => { 'user': 'barney' }
    function memoize(func, resolver) {
      if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var memoized = function() {
        var args = arguments,
            key = resolver ? resolver.apply(this, args) : args[0],
            cache = memoized.cache;

        if (cache.has(key)) {
          return cache.get(key);
        }
        var result = func.apply(this, args);
        memoized.cache = cache.set(key, result);
        return result;
      };
      memoized.cache = new memoize.Cache;
      return memoized;
    }


Creates a function that runs each argument through a corresponding transform function.

static
memberOf
category
Function
Params
func Function The function to wrap.
[transforms] ...(Function Function[]) The functions to transform arguments, specified as individual functions or arrays of functions.
Returns
Function Returns the new function.
example function
doubled(n) { return n 2; } function square(n) { return n n; } var modded = .modArgs(function(x, y) { return [x, y]; }, square, doubled); modded(1, 2); // => [1, 4] modded(5, 10); // => [25, 20]
    var modArgs = restParam(function(func, transforms) {
      transforms = baseFlatten(transforms);
      if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      var length = transforms.length;
      return restParam(function(args) {
        var index = nativeMin(args.length, length);
        while (index--) {
          args[index] = transforms[index](args[index]);
        }
        return func.apply(this, args);
      });
    });


Creates a function that negates the result of the predicate func. The func predicate is invoked with the this binding and arguments of the created function.

static
memberOf
_
category
Function
Params
predicate Function The predicate to negate.
Returns
Function Returns the new function.
example function
isEven(n) { return n % 2 == 0; } .filter([1, 2, 3, 4, 5, 6], .negate(isEven)); // => [1, 3, 5]
    function negate(predicate) {
      if (typeof predicate != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return function() {
        return !predicate.apply(this, arguments);
      };
    }


Creates a function that is restricted to invoking func once. Repeat calls to the function return the value of the first call. The func is invoked with the this binding and arguments of the created function.

static
memberOf
category
Function
Params
func Function The function to restrict.
Returns
Function Returns the new restricted function.
example var
initialize = .once(createApplication); initialize(); initialize(); // initialize invokes createApplication once
    function once(func) {
      return before(2, func);
    }


Creates a function that invokes func with partial arguments prepended to those provided to the new function. This method is like .bind except it does not alter the this binding.

The .partial.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for partially applied arguments.

Note: This method does not set the "length" property of partially applied functions.

static
memberOf
category
Function
Params
func Function The function to partially apply arguments to.
[partials] ...* The arguments to be partially applied.
Returns
Function Returns the new partially applied function.
example var
greet = function(greeting, name) { return greeting + ' ' + name; }; var sayHelloTo = _.partial(greet, 'hello'); sayHelloTo('fred'); // => 'hello fred' // using placeholders var greetFred = .partial(greet, , 'fred'); greetFred('hi'); // => 'hi fred'
    var partial = createPartial(PARTIAL_FLAG);


This method is like .partial except that partially applied arguments are appended to those provided to the new function.

The .partialRight.placeholder value, which defaults to in monolithic builds, may be used as a placeholder for partially applied arguments.

Note: This method does not set the "length" property of partially applied functions.

static
memberOf
category
Function
Params
func Function The function to partially apply arguments to.
[partials] ...* The arguments to be partially applied.
Returns
Function Returns the new partially applied function.
example var
greet = function(greeting, name) { return greeting + ' ' + name; }; var greetFred = _.partialRight(greet, 'fred'); greetFred('hi'); // => 'hi fred' // using placeholders var sayHelloTo = .partialRight(greet, 'hello', ); sayHelloTo('fred'); // => 'hello fred'
    var partialRight = createPartial(PARTIAL_RIGHT_FLAG);


Creates a function that invokes func with arguments arranged according to the specified indexes where the argument value at the first index is provided as the first argument, the argument value at the second index is provided as the second argument, and so on.

static
memberOf
category
Function
Params
func Function The function to rearrange arguments for.
indexes ...(number number[]) The arranged argument indexes, specified as individual indexes or arrays of indexes.
Returns
Function Returns the new function.
example var
rearged = .rearg(function(a, b, c) { return [a, b, c]; }, 2, 0, 1); rearged('b', 'c', 'a') // => ['a', 'b', 'c'] var map = .rearg(.map, [1, 0]); map(function(n) { return n * 3; }, [1, 2, 3]); // => [3, 6, 9]
    var rearg = restParam(function(func, indexes) {
      return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));
    });


Creates a function that invokes func with the this binding of the created function and arguments from start and beyond provided as an array.

Note: This method is based on the rest parameter.

static
memberOf
_
category
Function
Params
func Function The function to apply a rest parameter to.
[start=func.length-1] number The start position of the rest parameter.
Returns
Function Returns the new function.
example var
say = .restParam(function(what, names) { return what + ' ' + .initial(names).join(', ') + (.size(names) > 1 ? ', & ' : '') + .last(names); }); say('hello', 'fred', 'barney', 'pebbles'); // => 'hello fred, barney, & pebbles'
    function restParam(func, start) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
      return function() {
        var args = arguments,
            index = -1,
            length = nativeMax(args.length - start, 0),
            rest = Array(length);

        while (++index < length) {
          rest[index] = args[start + index];
        }
        switch (start) {
          case 0: return func.call(this, rest);
          case 1: return func.call(this, args[0], rest);
          case 2: return func.call(this, args[0], args[1], rest);
        }
        var otherArgs = Array(start + 1);
        index = -1;
        while (++index < start) {
          otherArgs[index] = args[index];
        }
        otherArgs[start] = rest;
        return func.apply(this, otherArgs);
      };
    }


Creates a function that invokes func with the this binding of the created function and an array of arguments much like Function#apply.

Note: This method is based on the spread operator.

static
memberOf
category
Function
Params
func Function The function to spread arguments over.
Returns
Function Returns the new function.
example var
say = .spread(function(who, what) { return who + ' says ' + what; }); say(['fred', 'hello']); // => 'fred says hello' // with a Promise var numbers = Promise.all([ Promise.resolve(40), Promise.resolve(36) ]); numbers.then(_.spread(function(x, y) { return x + y; })); // => a Promise of 76
    function spread(func) {
      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      return function(array) {
        return func.apply(this, array);
      };
    }


Creates a throttled function that only invokes func at most once per every wait milliseconds. The throttled function comes with a cancel method to cancel delayed invocations. Provide an options object to indicate that func should be invoked on the leading and/or trailing edge of the wait timeout. Subsequent calls to the throttled function return the result of the last func call.

Note: If leading and trailing options are true, func is invoked on the trailing edge of the timeout only if the the throttled function is invoked more than once during the wait timeout.

See David Corbacho's article for details over the differences between .throttle and .debounce.

static
memberOf
category
Function
Params
func Function The function to throttle.
[wait=0] number The number of milliseconds to throttle invocations to.
[options] Object The options object.
[options.leading=true] boolean Specify invoking on the leading edge of the timeout.
[options.trailing=true] boolean Specify invoking on the trailing edge of the timeout.
Returns
Function Returns the new throttled function.
example //
avoid excessively updating the position while scrolling jQuery(window).on('scroll', .throttle(updatePosition, 100)); // invoke renewToken when the click event is fired, but not more than once every 5 minutes jQuery('.interactive').on('click', _.throttle(renewToken, 300000, { 'trailing': false })); // cancel a trailing throttled call jQuery(window).on('popstate', throttled.cancel);
    function throttle(func, wait, options) {
      var leading = true,
          trailing = true;

      if (typeof func != 'function') {
        throw new TypeError(FUNC_ERROR_TEXT);
      }
      if (options === false) {
        leading = false;
      } else if (isObject(options)) {
        leading = 'leading' in options ? !!options.leading : leading;
        trailing = 'trailing' in options ? !!options.trailing : trailing;
      }
      return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
    }


Creates a function that provides value to the wrapper function as its first argument. Any additional arguments provided to the function are appended to those provided to the wrapper function. The wrapper is invoked with the this binding of the created function.

static
memberOf
_
category
Function
Params
value * The value to wrap.
wrapper Function The wrapper function.
Returns
Function Returns the new function.
example var
p = .wrap(.escape, function(func, text) { return '' + func(text) + ''; }); p('fred, barney, & pebbles'); // => 'fred, barney, & pebbles'
    function wrap(value, wrapper) {
      wrapper = wrapper == null ? identity : wrapper;
      return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);
    }

    /*------------------------------------------------------------------------*/


Creates a clone of value. If isDeep is true nested objects are cloned, otherwise they are assigned by reference. If customizer is provided it is invoked to produce the cloned values. If customizer returns undefined cloning is handled by the method instead. The customizer is bound to thisArg and invoked with two argument; (value [, index|key, object]).

Note: This method is loosely based on the structured clone algorithm. The enumerable properties of arguments objects and objects created by constructors other than Object are cloned to plain Object objects. An empty object is returned for uncloneable values such as functions, DOM nodes, Maps, Sets, and WeakMaps.

static
memberOf
category
Lang
Params
value The value to clone.
[isDeep] boolean Specify a deep clone.
[customizer] Function The function to customize cloning values.
[thisArg] The this binding of customizer.
Returns
* Returns the cloned value.
example var
users = [ { 'user': 'barney' }, { 'user': 'fred' } ]; var shallow = .clone(users); shallow[0] === users[0]; // => true var deep = _.clone(users, true); deep[0] === users[0]; // => false // using a customizer callback var el = .clone(document.body, function(value) { if (.isElement(value)) { return value.cloneNode(false); } }); el === document.body // => false el.nodeName // => BODY el.childNodes.length; // => 0
    function clone(value, isDeep, customizer, thisArg) {
      if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {
        isDeep = false;
      }
      else if (typeof isDeep == 'function') {
        thisArg = customizer;
        customizer = isDeep;
        isDeep = false;
      }
      return typeof customizer == 'function'
        ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))
        : baseClone(value, isDeep);
    }


Creates a deep clone of value. If customizer is provided it is invoked to produce the cloned values. If customizer returns undefined cloning is handled by the method instead. The customizer is bound to thisArg and invoked with two argument; (value [, index|key, object]).

Note: This method is loosely based on the structured clone algorithm. The enumerable properties of arguments objects and objects created by constructors other than Object are cloned to plain Object objects. An empty object is returned for uncloneable values such as functions, DOM nodes, Maps, Sets, and WeakMaps.

static
memberOf
category
Lang
Params
value The value to deep clone.
[customizer] Function The function to customize cloning values.
[thisArg] The this binding of customizer.
Returns
* Returns the deep cloned value.
example var
users = [ { 'user': 'barney' }, { 'user': 'fred' } ]; var deep = .cloneDeep(users); deep[0] === users[0]; // => false // using a customizer callback var el = .cloneDeep(document.body, function(value) { if (.isElement(value)) { return value.cloneNode(true); } }); el === document.body // => false el.nodeName // => BODY el.childNodes.length; // => 20
    function cloneDeep(value, customizer, thisArg) {
      return typeof customizer == 'function'
        ? baseClone(value, true, bindCallback(customizer, thisArg, 1))
        : baseClone(value, true);
    }


Checks if value is greater than other.

static
memberOf
category
Lang
Params
value The value to compare.
other The other value to compare.
Returns
boolean Returns true if value is greater than other, else false.
example .gt(3,
1); // => true .gt(3, 3); // => false .gt(1, 3); // => false
    function gt(value, other) {
      return value > other;
    }


Checks if value is greater than or equal to other.

static
memberOf
category
Lang
Params
value The value to compare.
other The other value to compare.
Returns
boolean Returns true if value is greater than or equal to other, else false.
example .gte(3,
1); // => true .gte(3, 3); // => true .gte(1, 3); // => false
    function gte(value, other) {
      return value >= other;
    }


Checks if value is classified as an arguments object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isArguments(function()
returnarguments;()); {returnarguments;}()); // => true _.isArguments([1, 2, 3]); // => false
    function isArguments(value) {
      return isObjectLike(value) && isArrayLike(value) &&
        hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
    }


Checks if value is classified as an Array object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isArray([1,
2, 3]); // => true _.isArray(function() { return arguments; }()); // => false
    var isArray = nativeIsArray || function(value) {
      return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
    };


Checks if value is classified as a boolean primitive or object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isBoolean(false); //
=> true _.isBoolean(null); // => false
    function isBoolean(value) {
      return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
    }


Checks if value is classified as a Date object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isDate(new
Date); // => true _.isDate('Mon April 23 2012'); // => false
    function isDate(value) {
      return isObjectLike(value) && objToString.call(value) == dateTag;
    }


Checks if value is a DOM element.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is a DOM element, else false.
example .isElement(document.body); //
=> true _.isElement(''); // => false
    function isElement(value) {
      return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
    }


Checks if value is empty. A value is considered empty unless it is an arguments object, array, string, or jQuery-like collection with a length greater than 0 or an object with own enumerable properties.

static
memberOf
category
Lang
Params
value Array Object string The value to inspect.
Returns
boolean Returns true if value is empty, else false.
example .isEmpty(null); //
=> true .isEmpty(true); // => true .isEmpty(1); // => true .isEmpty([1, 2, 3]); // => false .isEmpty({ 'a': 1 }); // => false
    function isEmpty(value) {
      if (value == null) {
        return true;
      }
      if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
          (isObjectLike(value) && isFunction(value.splice)))) {
        return !value.length;
      }
      return !keys(value).length;
    }


Performs a deep comparison between two values to determine if they are equivalent. If customizer is provided it is invoked to compare values. If customizer returns undefined comparisons are handled by the method instead. The customizer is bound to thisArg and invoked with three arguments: (value, other [, index|key]).

Note: This method supports comparing arrays, booleans, Date objects, numbers, Object objects, regexes, and strings. Objects are compared by their own, not inherited, enumerable properties. Functions and DOM nodes are not supported. Provide a customizer function to extend support for comparing other values.

static
memberOf
alias
eq
category
Lang
Params
value The value to compare.
other The other value to compare.
[customizer] Function The function to customize value comparisons.
[thisArg] * The this binding of customizer.
Returns
boolean Returns true if the values are equivalent, else false.
example var
object = { 'user': 'fred' }; var other = { 'user': 'fred' }; object == other; // => false .isEqual(object, other); // => true // using a customizer callback var array = ['hello', 'goodbye']; var other = ['hi', 'goodbye']; .isEqual(array, other, function(value, other) { if (.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) { return true; } }); // => true
    function isEqual(value, other, customizer, thisArg) {
      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
      var result = customizer ? customizer(value, other) : undefined;
      return  result === undefined ? baseIsEqual(value, other, customizer) : !!result;
    }


Checks if value is an Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, or URIError object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is an error object, else false.
example .isError(new
Error); // => true _.isError(Error); // => false
    function isError(value) {
      return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
    }


Checks if value is a finite primitive number.

Note: This method is based on Number.isFinite.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is a finite number, else false.
example .isFinite(10); //
=> true .isFinite('10'); // => false .isFinite(true); // => false .isFinite(Object(10)); // => false .isFinite(Infinity); // => false
    function isFinite(value) {
      return typeof value == 'number' && nativeIsFinite(value);
    }


Checks if value is classified as a Function object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isFunction(); //
=> true .isFunction(/abc/); // => false
    function isFunction(value) {

The use of Object#toString avoids issues with the typeof operator in older versions of Chrome and Safari which return 'function' for regexes and Safari 8 equivalents which return 'object' for typed array constructors.

      return isObject(value) && objToString.call(value) == funcTag;
    }


Checks if value is the language type of Object. (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is an object, else false.
example .isObject({}); //
=> true .isObject([1, 2, 3]); // => true .isObject(1); // => false
    function isObject(value) {

Avoid a V8 JIT bug in Chrome 19-20. See https://code.google.com/p/v8/issues/detail?id=2291 for more details.

      var type = typeof value;
      return !!value && (type == 'object' || type == 'function');
    }


Performs a deep comparison between object and source to determine if object contains equivalent property values. If customizer is provided it is invoked to compare values. If customizer returns undefined comparisons are handled by the method instead. The customizer is bound to thisArg and invoked with three arguments: (value, other, index|key).

Note: This method supports comparing properties of arrays, booleans, Date objects, numbers, Object objects, regexes, and strings. Functions and DOM nodes are not supported. Provide a customizer function to extend support for comparing other values.

static
memberOf
category
Lang
Params
object Object The object to inspect.
source Object The object of property values to match.
[customizer] Function The function to customize value comparisons.
[thisArg] * The this binding of customizer.
Returns
boolean Returns true if object is a match, else false.
example var
object = { 'user': 'fred', 'age': 40 }; .isMatch(object, { 'age': 40 }); // => true _.isMatch(object, { 'age': 36 }); // => false // using a customizer callback var object = { 'greeting': 'hello' }; var source = { 'greeting': 'hi' }; .isMatch(object, source, function(value, other) { return .every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined; }); // => true
    function isMatch(object, source, customizer, thisArg) {
      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
      return baseIsMatch(object, getMatchData(source), customizer);
    }


Checks if value is NaN.

Note: This method is not the same as isNaN which returns true for undefined and other non-numeric values.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is NaN, else false.
example .isNaN(NaN); //
=> true .isNaN(new Number(NaN)); // => true isNaN(undefined); // => true .isNaN(undefined); // => false
    function isNaN(value) {

An NaN primitive is the only value that is not equal to itself. Perform the toStringTag check first to avoid errors with some host objects in IE.

      return isNumber(value) && value != +value;
    }


Checks if value is a native function.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is a native function, else false.
example .isNative(Array.prototype.push); //
=> true .isNative(); // => false
    function isNative(value) {
      if (value == null) {
        return false;
      }
      if (isFunction(value)) {
        return reIsNative.test(fnToString.call(value));
      }
      return isObjectLike(value) && reIsHostCtor.test(value);
    }


Checks if value is null.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is null, else false.
example .isNull(null); //
=> true _.isNull(void 0); // => false
    function isNull(value) {
      return value === null;
    }


Checks if value is classified as a Number primitive or object.

Note: To exclude Infinity, -Infinity, and NaN, which are classified as numbers, use the .isFinite method.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isNumber(8.4); //
=> true .isNumber(NaN); // => true _.isNumber('8.4'); // => false
    function isNumber(value) {
      return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
    }


Checks if value is a plain object, that is, an object created by the Object constructor or one with a [[Prototype]] of null.

Note: This method assumes objects created by the Object constructor have no inherited enumerable properties.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is a plain object, else false.
example function
Foo() { this.a = 1; } .isPlainObject(new Foo); // => false .isPlainObject([1, 2, 3]); // => false .isPlainObject({ 'x': 0, 'y': 0 }); // => true _.isPlainObject(Object.create(null)); // => true
    function isPlainObject(value) {
      var Ctor;


Exit early for non Object objects.

      if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||
          (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
        return false;
      }

IE < 9 iterates inherited properties before own properties. If the first iterated property is an object's own property then there are no inherited enumerable properties.

      var result;

In most environments an object's own properties are iterated before its inherited properties. If the last iterated property is an object's own property then there are no inherited enumerable properties.

      baseForIn(value, function(subValue, key) {
        result = key;
      });
      return result === undefined || hasOwnProperty.call(value, result);
    }


Checks if value is classified as a RegExp object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isRegExp(/abc/); //
=> true _.isRegExp('/abc/'); // => false
    function isRegExp(value) {
      return isObject(value) && objToString.call(value) == regexpTag;
    }


Checks if value is classified as a String primitive or object.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isString('abc'); //
=> true _.isString(1); // => false
    function isString(value) {
      return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
    }


Checks if value is classified as a typed array.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is correctly classified, else false.
example .isTypedArray(new
Uint8Array); // => true _.isTypedArray([]); // => false
    function isTypedArray(value) {
      return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
    }


Checks if value is undefined.

static
memberOf
category
Lang
Params
value * The value to check.
Returns
boolean Returns true if value is undefined, else false.
example .isUndefined(void
0); // => true _.isUndefined(null); // => false
    function isUndefined(value) {
      return value === undefined;
    }


Checks if value is less than other.

static
memberOf
category
Lang
Params
value The value to compare.
other The other value to compare.
Returns
boolean Returns true if value is less than other, else false.
example .lt(1,
3); // => true .lt(3, 3); // => false .lt(3, 1); // => false
    function lt(value, other) {
      return value < other;
    }


Checks if value is less than or equal to other.

static
memberOf
category
Lang
Params
value The value to compare.
other The other value to compare.
Returns
boolean Returns true if value is less than or equal to other, else false.
example .lte(1,
3); // => true .lte(3, 3); // => true .lte(3, 1); // => false
    function lte(value, other) {
      return value <= other;
    }


Converts value to an array.

static
memberOf
category
Lang
Params
value * The value to convert.
Returns
Array Returns the converted array.
example (function()
return.toArray(arguments).slice(1); { return_.toArray(arguments).slice(1); }(1, 2, 3)); // => [2, 3]
    function toArray(value) {
      var length = value ? getLength(value) : 0;
      if (!isLength(length)) {
        return values(value);
      }
      if (!length) {
        return [];
      }
      return arrayCopy(value);
    }


Converts value to a plain object flattening inherited enumerable properties of value to own properties of the plain object.

static
memberOf
category
Lang
Params
value * The value to convert.
Returns
Object Returns the converted plain object.
example function
Foo() { this.b = 2; } Foo.prototype.c = 3; .assign({ 'a': 1 }, new Foo); // => { 'a': 1, 'b': 2 } .assign({ 'a': 1 }, .toPlainObject(new Foo)); // => { 'a': 1, 'b': 2, 'c': 3 }
    function toPlainObject(value) {
      return baseCopy(value, keysIn(value));
    }

    /*------------------------------------------------------------------------*/


Recursively merges own enumerable properties of the source object(s), that don't resolve to undefined into the destination object. Subsequent sources overwrite property assignments of previous sources. If customizer is provided it is invoked to produce the merged values of the destination and source properties. If customizer returns undefined merging is handled by the method instead. The customizer is bound to thisArg and invoked with five arguments: (objectValue, sourceValue, key, object, source).

static
memberOf
category
Object
Params
object Object The destination object.
[sources] ...Object The source objects.
[customizer] Function The function to customize assigned values.
[thisArg] * The this binding of customizer.
Returns
Object Returns object.
example var
users = { 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] }; var ages = { 'data': [{ 'age': 36 }, { 'age': 40 }] }; .merge(users, ages); // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } // using a customizer callback var object = { 'fruits': ['apple'], 'vegetables': ['beet'] }; var other = { 'fruits': ['banana'], 'vegetables': ['carrot'] }; .merge(object, other, function(a, b) { if (.isArray(a)) { return a.concat(b); } }); // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
    var merge = createAssigner(baseMerge);


Assigns own enumerable properties of source object(s) to the destination object. Subsequent sources overwrite property assignments of previous sources. If customizer is provided it is invoked to produce the assigned values. The customizer is bound to thisArg and invoked with five arguments: (objectValue, sourceValue, key, object, source).

Note: This method mutates object and is based on Object.assign.

static
memberOf
alias
extend
category
Object
Params
object Object The destination object.
[sources] ...Object The source objects.
[customizer] Function The function to customize assigned values.
[thisArg] * The this binding of customizer.
Returns
Object Returns object.
example .assign({
'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); // => { 'user': 'fred', 'age': 40 } // using a customizer callback var defaults = .partialRight(.assign, function(value, other) { return _.isUndefined(value) ? other : value; }); defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); // => { 'user': 'barney', 'age': 36 }
    var assign = createAssigner(function(object, source, customizer) {
      return customizer
        ? assignWith(object, source, customizer)
        : baseAssign(object, source);
    });


Creates an object that inherits from the given prototype object. If a properties object is provided its own enumerable properties are assigned to the created object.

static
memberOf
category
Object
Params
prototype Object The object to inherit from.
[properties] Object The properties to assign to the object.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Object Returns the new object.
example function
Shape() { this.x = 0; this.y = 0; } function Circle() { Shape.call(this); } Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle }); var circle = new Circle; circle instanceof Circle; // => true circle instanceof Shape; // => true
    function create(prototype, properties, guard) {
      var result = baseCreate(prototype);
      if (guard && isIterateeCall(prototype, properties, guard)) {
        properties = undefined;
      }
      return properties ? baseAssign(result, properties) : result;
    }


Assigns own enumerable properties of source object(s) to the destination object for all destination properties that resolve to undefined. Once a property is set, additional values of the same property are ignored.

Note: This method mutates object.

static
memberOf
category
Object
Params
object Object The destination object.
[sources] ...Object The source objects.
Returns
Object Returns object.
example .defaults({
'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); // => { 'user': 'barney', 'age': 36 }
    var defaults = createDefaults(assign, assignDefaults);


This method is like .defaults except that it recursively assigns default properties.

Note: This method mutates object.

static
memberOf
category
Object
Params
object Object The destination object.
[sources] ...Object The source objects.
Returns
Object Returns object.
example _.defaultsDeep({
'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } }); // => { 'user': { 'name': 'barney', 'age': 36 } }
    var defaultsDeep = createDefaults(merge, mergeDefaults);


This method is like .find except that it returns the key of the first element predicate returns truthy for instead of the element itself.

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Object
Params
object Object The object to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
string undefined Returns the key of the matched element, else undefined.
example var
users = { 'barney': { 'age': 36, 'active': true }, 'fred': { 'age': 40, 'active': false }, 'pebbles': { 'age': 1, 'active': true } }; .findKey(users, function(chr) { return chr.age < 40; }); // => 'barney' (iteration order is not guaranteed) // using the .matches callback shorthand .findKey(users, { 'age': 1, 'active': true }); // => 'pebbles' // using the .matchesProperty callback shorthand .findKey(users, 'active', false); // => 'fred' // using the .property callback shorthand _.findKey(users, 'active'); // => 'barney'
    var findKey = createFindKey(baseForOwn);


This method is like .findKey except that it iterates over elements of a collection in the opposite order.

If a property name is provided for predicate the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for predicate the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Object
Params
object Object The object to search.
[predicate=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of predicate.
Returns
string undefined Returns the key of the matched element, else undefined.
example var
users = { 'barney': { 'age': 36, 'active': true }, 'fred': { 'age': 40, 'active': false }, 'pebbles': { 'age': 1, 'active': true } }; .findLastKey(users, function(chr) { return chr.age < 40; }); // => returns pebbles assuming </em>.findKey<code>returns</code>barney // using the .matches callback shorthand .findLastKey(users, { 'age': 36, 'active': true }); // => 'barney' // using the .matchesProperty callback shorthand .findLastKey(users, 'active', false); // => 'fred' // using the .property callback shorthand .findLastKey(users, 'active'); // => 'pebbles'
    var findLastKey = createFindKey(baseForOwnRight);


Iterates over own and inherited enumerable properties of an object invoking iteratee for each property. The iteratee is bound to thisArg and invoked with three arguments: (value, key, object). Iteratee functions may exit iteration early by explicitly returning false.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns object.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; _.forIn(new Foo, function(value, key) { console.log(key); }); // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
    var forIn = createForIn(baseFor);


This method is like .forIn except that it iterates over properties of object in the opposite order.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=_.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns object.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .forInRight(new Foo, function(value, key) { console.log(key); }); // => logs 'c', 'b', and 'a' assuming </em>.forIn logs 'a', 'b', and 'c'
    var forInRight = createForIn(baseForRight);


Iterates over own enumerable properties of an object invoking iteratee for each property. The iteratee is bound to thisArg and invoked with three arguments: (value, key, object). Iteratee functions may exit iteration early by explicitly returning false.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns object.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; _.forOwn(new Foo, function(value, key) { console.log(key); }); // => logs 'a' and 'b' (iteration order is not guaranteed)
    var forOwn = createForOwn(baseForOwn);


This method is like .forOwn except that it iterates over properties of object in the opposite order.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=_.identity] Function The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns object.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .forOwnRight(new Foo, function(value, key) { console.log(key); }); // => logs 'b' and 'a' assuming </em>.forOwn logs 'a' and 'b'
    var forOwnRight = createForOwn(baseForOwnRight);


Creates an array of function property names from all enumerable properties, own and inherited, of object.

static
memberOf
alias
methods
category
Object
Params
object Object The object to inspect.
Returns
Array Returns the new array of property names.
example .functions(_); //
=> ['after', 'ary', 'assign', ...]
    function functions(object) {
      return baseFunctions(object, keysIn(object));
    }


Gets the property value at path of object. If the resolved value is undefined the defaultValue is used in its place.

static
memberOf
category
Object
Params
object Object The object to query.
path Array string The path of the property to get.
[defaultValue] The value returned if the resolved value is undefined.
Returns
Returns the resolved value.
example var
object = { 'a': [{ 'b': { 'c': 3 } }] }; .get(object, 'a[0].b.c'); // => 3 .get(object, ['a', '0', 'b', 'c']); // => 3 .get(object, 'a.b.c', 'default'); // => 'default'
    function get(object, path, defaultValue) {
      var result = object == null ? undefined : baseGet(object, toPath(path), path + '');
      return result === undefined ? defaultValue : result;
    }


Checks if path is a direct property.

static
memberOf
category
Object
Params
object Object The object to query.
path Array string The path to check.
Returns
boolean Returns true if path is a direct property, else false.
example var
object = { 'a': { 'b': { 'c': 3 } } }; .has(object, 'a'); // => true .has(object, 'a.b.c'); // => true .has(object, ['a', 'b', 'c']); // => true
    function has(object, path) {
      if (object == null) {
        return false;
      }
      var result = hasOwnProperty.call(object, path);
      if (!result && !isKey(path)) {
        path = toPath(path);
        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
        if (object == null) {
          return false;
        }
        path = last(path);
        result = hasOwnProperty.call(object, path);
      }
      return result || (isLength(object.length) && isIndex(path, object.length) &&
        (isArray(object) || isArguments(object)));
    }


Creates an object composed of the inverted keys and values of object. If object contains duplicate values, subsequent values overwrite property assignments of previous values unless multiValue is true.

static
memberOf
category
Object
Params
object Object The object to invert.
[multiValue] boolean Allow multiple values per key.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
Object Returns the new inverted object.
example var
object = { 'a': 1, 'b': 2, 'c': 1 }; .invert(object); // => { '1': 'c', '2': 'b' } // with multiValue .invert(object, true); // => { '1': ['a', 'c'], '2': ['b'] }
    function invert(object, multiValue, guard) {
      if (guard && isIterateeCall(object, multiValue, guard)) {
        multiValue = undefined;
      }
      var index = -1,
          props = keys(object),
          length = props.length,
          result = {};

      while (++index < length) {
        var key = props[index],
            value = object[key];

        if (multiValue) {
          if (hasOwnProperty.call(result, value)) {
            result[value].push(key);
          } else {
            result[value] = [key];
          }
        }
        else {
          result[value] = key;
        }
      }
      return result;
    }


Creates an array of the own enumerable property names of object.

Note: Non-object values are coerced to objects. See the ES spec for more details.

static
memberOf
category
Object
Params
object Object The object to query.
Returns
Array Returns the array of property names.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .keys(new Foo); // => ['a', 'b'] (iteration order is not guaranteed) _.keys('hi'); // => ['0', '1']
    var keys = !nativeKeys ? shimKeys : function(object) {
      var Ctor = object == null ? undefined : object.constructor;
      if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
          (typeof object != 'function' && isArrayLike(object))) {
        return shimKeys(object);
      }
      return isObject(object) ? nativeKeys(object) : [];
    };


Creates an array of the own and inherited enumerable property names of object.

Note: Non-object values are coerced to objects.

static
memberOf
category
Object
Params
object Object The object to query.
Returns
Array Returns the array of property names.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .keysIn(new Foo); // => ['a', 'b', 'c'] (iteration order is not guaranteed)
    function keysIn(object) {
      if (object == null) {
        return [];
      }
      if (!isObject(object)) {
        object = Object(object);
      }
      var length = object.length;
      length = (length && isLength(length) &&
        (isArray(object) || isArguments(object)) && length) || 0;

      var Ctor = object.constructor,
          index = -1,
          isProto = typeof Ctor == 'function' && Ctor.prototype === object,
          result = Array(length),
          skipIndexes = length > 0;

      while (++index < length) {
        result[index] = (index + '');
      }
      for (var key in object) {
        if (!(skipIndexes && isIndex(key, length)) &&
            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
          result.push(key);
        }
      }
      return result;
    }


The opposite of .mapValues; this method creates an object with the same values as object and keys generated by running each own enumerable property of object through iteratee.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns the new mapped object.
example .mapKeys({
'a': 1, 'b': 2 }, function(value, key) { return key + value; }); // => { 'a1': 1, 'b2': 2 }
    var mapKeys = createObjectMapper(true);


Creates an object with the same keys as object and values generated by running each own enumerable property of object through iteratee. The iteratee function is bound to thisArg and invoked with three arguments: (value, key, object).

If a property name is provided for iteratee the created .property style callback returns the property value of the given element.

If a value is also provided for thisArg the created .matchesProperty style callback returns true for elements that have a matching property value, else false.

If an object is provided for iteratee the created .matches style callback returns true for elements that have the properties of the given object, else false.

static
memberOf
category
Object
Params
object Object The object to iterate over.
[iteratee=.identity] Function Object string The function invoked per iteration.
[thisArg] * The this binding of iteratee.
Returns
Object Returns the new mapped object.
example .mapValues({
'a': 1, 'b': 2 }, function(n) { return n * 3; }); // => { 'a': 3, 'b': 6 } var users = { 'fred': { 'user': 'fred', 'age': 40 }, 'pebbles': { 'user': 'pebbles', 'age': 1 } }; // using the .property callback shorthand .mapValues(users, 'age'); // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
    var mapValues = createObjectMapper();


The opposite of .pick; this method creates an object composed of the own and inherited enumerable properties of object that are not omitted.

static
memberOf
category
Object
Params
object Object The source object.
[predicate] Function ...(string string[]) The function invoked per iteration or property names to omit, specified as individual property names or arrays of property names.
[thisArg] * The this binding of predicate.
Returns
Object Returns the new object.
example var
object = { 'user': 'fred', 'age': 40 }; _.omit(object, 'age'); // => { 'user': 'fred' } .omit(object, .isNumber); // => { 'user': 'fred' }
    var omit = restParam(function(object, props) {
      if (object == null) {
        return {};
      }
      if (typeof props[0] != 'function') {
        var props = arrayMap(baseFlatten(props), String);
        return pickByArray(object, baseDifference(keysIn(object), props));
      }
      var predicate = bindCallback(props[0], props[1], 3);
      return pickByCallback(object, function(value, key, object) {
        return !predicate(value, key, object);
      });
    });


Creates a two dimensional array of the key-value pairs for object, e.g. [[key1, value1], [key2, value2]].

static
memberOf
category
Object
Params
object Object The object to query.
Returns
Array Returns the new array of key-value pairs.
example .pairs({
'barney': 36, 'fred': 40 }); // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
    function pairs(object) {
      object = toObject(object);

      var index = -1,
          props = keys(object),
          length = props.length,
          result = Array(length);

      while (++index < length) {
        var key = props[index];
        result[index] = [key, object[key]];
      }
      return result;
    }


Creates an object composed of the picked object properties. Property names may be specified as individual arguments or as arrays of property names. If predicate is provided it is invoked for each property of object picking the properties predicate returns truthy for. The predicate is bound to thisArg and invoked with three arguments: (value, key, object).

static
memberOf
category
Object
Params
object Object The source object.
[predicate] Function ...(string string[]) The function invoked per iteration or property names to pick, specified as individual property names or arrays of property names.
[thisArg] * The this binding of predicate.
Returns
Object Returns the new object.
example var
object = { 'user': 'fred', 'age': 40 }; .pick(object, 'user'); // => { 'user': 'fred' } .pick(object, .isString); // => { 'user': 'fred' }
    var pick = restParam(function(object, props) {
      if (object == null) {
        return {};
      }
      return typeof props[0] == 'function'
        ? pickByCallback(object, bindCallback(props[0], props[1], 3))
        : pickByArray(object, baseFlatten(props));
    });


This method is like .get except that if the resolved value is a function it is invoked with the this binding of its parent object and its result is returned.

static
memberOf
category
Object
Params
object Object The object to query.
path Array string The path of the property to resolve.
[defaultValue] The value returned if the resolved value is undefined.
Returns
Returns the resolved value.
example var
object = { 'a': [{ 'b': { 'c1': 3, 'c2': .constant(4) } }] }; .result(object, 'a[0].b.c1'); // => 3 .result(object, 'a[0].b.c2'); // => 4 .result(object, 'a.b.c', 'default'); // => 'default' .result(object, 'a.b.c', .constant('default')); // => 'default'
    function result(object, path, defaultValue) {
      var result = object == null ? undefined : object[path];
      if (result === undefined) {
        if (object != null && !isKey(path, object)) {
          path = toPath(path);
          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
          result = object == null ? undefined : object[last(path)];
        }
        result = result === undefined ? defaultValue : result;
      }
      return isFunction(result) ? result.call(object) : result;
    }


Sets the property value of path on object. If a portion of path does not exist it is created.

static
memberOf
category
Object
Params
object Object The object to augment.
path Array string The path of the property to set.
value * The value to set.
Returns
Object Returns object.
example var
object = { 'a': [{ 'b': { 'c': 3 } }] }; .set(object, 'a[0].b.c', 4); console.log(object.a[0].b.c); // => 4 _.set(object, 'x[0].y.z', 5); console.log(object.x[0].y.z); // => 5
    function set(object, path, value) {
      if (object == null) {
        return object;
      }
      var pathKey = (path + '');
      path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);

      var index = -1,
          length = path.length,
          lastIndex = length - 1,
          nested = object;

      while (nested != null && ++index < length) {
        var key = path[index];
        if (isObject(nested)) {
          if (index == lastIndex) {
            nested[key] = value;
          } else if (nested[key] == null) {
            nested[key] = isIndex(path[index + 1]) ? [] : {};
          }
        }
        nested = nested[key];
      }
      return object;
    }


An alternative to .reduce; this method transforms object to a new accumulator object which is the result of running each of its own enumerable properties through iteratee, with each invocation potentially mutating the accumulator object. The iteratee is bound to thisArg and invoked with four arguments: (accumulator, value, key, object). Iteratee functions may exit iteration early by explicitly returning false.

static
memberOf
category
Object
Params
object Array Object The object to iterate over.
[iteratee=.identity] Function The function invoked per iteration.
[accumulator] The custom accumulator value.
[thisArg] The this binding of iteratee.
Returns
* Returns the accumulated value.
example .transform([2,
3, 4], function(result, n) { result.push(n = n); return n % 2 == 0; }); // => [4, 9] _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) { result[key] = n 3; }); // => { 'a': 3, 'b': 6 }
    function transform(object, iteratee, accumulator, thisArg) {
      var isArr = isArray(object) || isTypedArray(object);
      iteratee = getCallback(iteratee, thisArg, 4);

      if (accumulator == null) {
        if (isArr || isObject(object)) {
          var Ctor = object.constructor;
          if (isArr) {
            accumulator = isArray(object) ? new Ctor : [];
          } else {
            accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
          }
        } else {
          accumulator = {};
        }
      }
      (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
        return iteratee(accumulator, value, index, object);
      });
      return accumulator;
    }


Creates an array of the own enumerable property values of object.

Note: Non-object values are coerced to objects.

static
memberOf
category
Object
Params
object Object The object to query.
Returns
Array Returns the array of property values.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .values(new Foo); // => [1, 2] (iteration order is not guaranteed) _.values('hi'); // => ['h', 'i']
    function values(object) {
      return baseValues(object, keys(object));
    }


Creates an array of the own and inherited enumerable property values of object.

Note: Non-object values are coerced to objects.

static
memberOf
category
Object
Params
object Object The object to query.
Returns
Array Returns the array of property values.
example function
Foo() { this.a = 1; this.b = 2; } Foo.prototype.c = 3; .valuesIn(new Foo); // => [1, 2, 3] (iteration order is not guaranteed)
    function valuesIn(object) {
      return baseValues(object, keysIn(object));
    }

    /*------------------------------------------------------------------------*/


Checks if n is between start and up to but not including, end. If end is not specified it is set to start with start then set to 0.

static
memberOf
category
Number
Params
n number The number to check.
[start=0] number The start of the range.
end number The end of the range.
Returns
boolean Returns true if n is in the range, else false.
example .inRange(3,
2, 4); // => true .inRange(4, 8); // => true .inRange(4, 2); // => false .inRange(2, 2); // => false .inRange(1.2, 2); // => true _.inRange(5.2, 4); // => false
    function inRange(value, start, end) {
      start = +start || 0;
      if (end === undefined) {
        end = start;
        start = 0;
      } else {
        end = +end || 0;
      }
      return value >= nativeMin(start, end) && value < nativeMax(start, end);
    }


Produces a random number between min and max (inclusive). If only one argument is provided a number between 0 and the given number is returned. If floating is true, or either min or max are floats, a floating-point number is returned instead of an integer.

static
memberOf
category
Number
Params
[min=0] number The minimum possible value.
[max=1] number The maximum possible value.
[floating] boolean Specify returning a floating-point number.
Returns
number Returns the random number.
example .random(0,
5); // => an integer between 0 and 5 .random(5); // => also an integer between 0 and 5 .random(5, true); // => a floating-point number between 0 and 5 _.random(1.2, 5.2); // => a floating-point number between 1.2 and 5.2
    function random(min, max, floating) {
      if (floating && isIterateeCall(min, max, floating)) {
        max = floating = undefined;
      }
      var noMin = min == null,
          noMax = max == null;

      if (floating == null) {
        if (noMax && typeof min == 'boolean') {
          floating = min;
          min = 1;
        }
        else if (typeof max == 'boolean') {
          floating = max;
          noMax = true;
        }
      }
      if (noMin && noMax) {
        max = 1;
        noMax = false;
      }
      min = +min || 0;
      if (noMax) {
        max = min;
        min = 0;
      } else {
        max = +max || 0;
      }
      if (floating || min % 1 || max % 1) {
        var rand = nativeRandom();
        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);
      }
      return baseRandom(min, max);
    }

    /*------------------------------------------------------------------------*/


Converts string to camel case.

static
memberOf
category
String
Params
[string=''] string The string to convert.
Returns
string Returns the camel cased string.
example .camelCase('Foo
Bar'); // => 'fooBar' _.camelCase('--foo-bar'); // => 'fooBar' .camelCase('_foo_bar'); // => 'fooBar'
    var camelCase = createCompounder(function(result, word, index) {
      word = word.toLowerCase();
      return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);
    });


Capitalizes the first character of string.

static
memberOf
category
String
Params
[string=''] string The string to capitalize.
Returns
string Returns the capitalized string.
example .capitalize('fred'); //
=> 'Fred'
    function capitalize(string) {
      string = baseToString(string);
      return string && (string.charAt(0).toUpperCase() + string.slice(1));
    }


Deburrs string by converting latin-1 supplementary letters#Charactertable) to basic latin letters and removing combining diacritical marks.

static
memberOf
category
String
Params
[string=''] string The string to deburr.
Returns
string Returns the deburred string.
example _.deburr('déjà
vu'); // => 'deja vu'
    function deburr(string) {
      string = baseToString(string);
      return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
    }


Checks if string ends with the given target string.

static
memberOf
category
String
Params
[string=''] string The string to search.
[target] string The string to search for.
[position=string.length] number The position to search from.
Returns
boolean Returns true if string ends with target, else false.
example .endsWith('abc',
'c'); // => true .endsWith('abc', 'b'); // => false .endsWith('abc', 'b', 2); // => true
    function endsWith(string, target, position) {
      string = baseToString(string);
      target = (target + '');

      var length = string.length;
      position = position === undefined
        ? length
        : nativeMin(position < 0 ? 0 : (+position || 0), length);

      position -= target.length;
      return position >= 0 && string.indexOf(target, position) == position;
    }


Converts the characters "&", "<", ">", '"', "'", and "`", in string to their corresponding HTML entities.

Note: No other characters are escaped. To escape additional characters use a third-party library like he.

Though the ">" character is escaped for symmetry, characters like ">" and "/" don't need escaping in HTML and have no special meaning unless they're part of a tag or unquoted attribute value. See Mathias Bynens's article (under "semi-related fun fact") for more details.

Backticks are escaped because in Internet Explorer < 9, they can break out of attribute values or HTML comments. See #59, #102, #108, and #133 of the HTML5 Security Cheatsheet for more details.

When working with HTML you should always quote attribute values to reduce XSS vectors.

static
memberOf
category
String
Params
[string=''] string The string to escape.
Returns
string Returns the escaped string.
example .escape('fred,
barney, & pebbles'); // => 'fred, barney, & pebbles'
    function escape(string) {

Reset lastIndex because in IE < 9 String#replace does not.

      string = baseToString(string);
      return (string && reHasUnescapedHtml.test(string))
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
        : string;
    }


Escapes the RegExp special characters "\", "/", "^", "$", ".", "|", "?", "*", "+", "(", ")", "[", "]", "{" and "}" in string.

static
memberOf
category
String
Params
[string=''] string The string to escape.
Returns
string Returns the escaped string.
example .escapeRegExp('lodash'); //
=> 'lodash'
    function escapeRegExp(string) {
      string = baseToString(string);
      return (string && reHasRegExpChars.test(string))
        ? string.replace(reRegExpChars, escapeRegExpChar)
        : (string || '(?:)');
    }


Converts string to kebab case.

static
memberOf
category
String
Params
[string=''] string The string to convert.
Returns
string Returns the kebab cased string.
example .kebabCase('Foo
Bar'); // => 'foo-bar' _.kebabCase('fooBar'); // => 'foo-bar' .kebabCase('_foo_bar'); // => 'foo-bar'
    var kebabCase = createCompounder(function(result, word, index) {
      return result + (index ? '-' : '') + word.toLowerCase();
    });


Pads string on the left and right sides if it's shorter than length. Padding characters are truncated if they can't be evenly divided by length.

static
memberOf
category
String
Params
[string=''] string The string to pad.
[length=0] number The padding length.
[chars=' string '] The string used as padding.
Returns
string Returns the padded string.
example .pad('abc',
8); // => ' abc ' .pad('abc', 8, '-'); // => '-abc-' .pad('abc', 3); // => 'abc'
    function pad(string, length, chars) {
      string = baseToString(string);
      length = +length;

      var strLength = string.length;
      if (strLength >= length || !nativeIsFinite(length)) {
        return string;
      }
      var mid = (length - strLength) / 2,
          leftLength = nativeFloor(mid),
          rightLength = nativeCeil(mid);

      chars = createPadding('', rightLength, chars);
      return chars.slice(0, leftLength) + string + chars;
    }


Pads string on the left side if it's shorter than length. Padding characters are truncated if they exceed length.

static
memberOf
category
String
Params
[string=''] string The string to pad.
[length=0] number The padding length.
[chars=' string '] The string used as padding.
Returns
string Returns the padded string.
example .padLeft('abc',
6); // => ' abc' .padLeft('abc', 6, '-'); // => '-_abc' .padLeft('abc', 3); // => 'abc'
    var padLeft = createPadDir();


Pads string on the right side if it's shorter than length. Padding characters are truncated if they exceed length.

static
memberOf
category
String
Params
[string=''] string The string to pad.
[length=0] number The padding length.
[chars=' string '] The string used as padding.
Returns
string Returns the padded string.
example .padRight('abc',
6); // => 'abc ' .padRight('abc', 6, '-'); // => 'abc-' _.padRight('abc', 3); // => 'abc'
    var padRight = createPadDir(true);


Converts string to an integer of the specified radix. If radix is undefined or 0, a radix of 10 is used unless value is a hexadecimal, in which case a radix of 16 is used.

Note: This method aligns with the ES5 implementation of parseInt.

static
memberOf
category
String
Params
string string The string to convert.
[radix] number The radix to interpret value by.
param-
Object [guard] Enables use as a callback for functions like .map.
Returns
number Returns the converted integer.
example _.parseInt('08'); //
=> 8 .map(['6', '08', '10'], .parseInt); // => [6, 8, 10]
    function parseInt(string, radix, guard) {

Firefox < 21 and Opera < 15 follow ES3 for parseInt. Chrome fails to trim leading whitespace characters. See https://code.google.com/p/v8/issues/detail?id=3109 for more details.

      if (guard ? isIterateeCall(string, radix, guard) : radix == null) {
        radix = 0;
      } else if (radix) {
        radix = +radix;
      }
      string = trim(string);
      return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
    }


Repeats the given string n times.

static
memberOf
category
String
Params
[string=''] string The string to repeat.
[n=0] number The number of times to repeat the string.
Returns
string Returns the repeated string.
example .repeat('',
3); // => '' .repeat('abc', 2); // => 'abcabc' .repeat('abc', 0); // => ''
    function repeat(string, n) {
      var result = '';
      string = baseToString(string);
      n = +n;
      if (n < 1 || !string || !nativeIsFinite(n)) {
        return result;
      }

Leverage the exponentiation by squaring algorithm for a faster repeat. See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.

      do {
        if (n % 2) {
          result += string;
        }
        n = nativeFloor(n / 2);
        string += string;
      } while (n);

      return result;
    }


Converts string to snake case.

static
memberOf
category
String
Params
[string=''] string The string to convert.
Returns
string Returns the snake cased string.
example .snakeCase('Foo
Bar'); // => 'foobar' .snakeCase('fooBar'); // => 'foobar' .snakeCase('--foo-bar'); // => 'foo_bar'
    var snakeCase = createCompounder(function(result, word, index) {
      return result + (index ? '_' : '') + word.toLowerCase();
    });


Converts string to start case.

static
memberOf
category
String
Params
[string=''] string The string to convert.
Returns
string Returns the start cased string.
example .startCase('--foo-bar'); //
=> 'Foo Bar' _.startCase('fooBar'); // => 'Foo Bar' .startCase('_foo_bar'); // => 'Foo Bar'
    var startCase = createCompounder(function(result, word, index) {
      return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
    });


Checks if string starts with the given target string.

static
memberOf
category
String
Params
[string=''] string The string to search.
[target] string The string to search for.
[position=0] number The position to search from.
Returns
boolean Returns true if string starts with target, else false.
example .startsWith('abc',
'a'); // => true .startsWith('abc', 'b'); // => false .startsWith('abc', 'b', 1); // => true
    function startsWith(string, target, position) {
      string = baseToString(string);
      position = position == null
        ? 0
        : nativeMin(position < 0 ? 0 : (+position || 0), string.length);

      return string.lastIndexOf(target, position) == position;
    }


Creates a compiled template function that can interpolate data properties in "interpolate" delimiters, HTML-escape interpolated data properties in "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data properties may be accessed as free variables in the template. If a setting object is provided it takes precedence over .templateSettings values.

Note: In the development build .template utilizes sourceURLs for easier debugging.

For more information on precompiling templates see lodash's custom builds documentation.

For more information on Chrome extension sandboxes see Chrome's extensions documentation.

static
memberOf
category
String
Params
[string=''] string The template string.
[options] Object The options object.
[options.escape] RegExp The HTML "escape" delimiter.
[options.evaluate] RegExp The "evaluate" delimiter.
[options.imports] Object An object to import into the template as free variables.
[options.interpolate] RegExp The "interpolate" delimiter.
[options.sourceURL] string The sourceURL of the template's compiled source.
[options.variable] string The data object variable name.
param-
Object [otherOptions] Enables the legacy options param signature.
Returns
Function Returns the compiled template function.
example //
using the "interpolate" delimiter to create a compiled template var compiled = .template('hello <%= user %>!'); compiled({ 'user': 'fred' }); // => 'hello fred!' // using the HTML "escape" delimiter to escape data property values var compiled = .template('<%- value %>'); compiled({ 'value': '