server/php/basic/public_html/static/lib/lodash/lodash.js
author rougeronj
Tue, 02 Jun 2015 16:43:45 +0200
changeset 456 a3bf10beb710
parent 442 adb907bba956
child 461 48235ed6b07d
permissions -rw-r--r--
copy client change to server (grunt copy-server)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * @license
456
a3bf10beb710 copy client change to server (grunt copy-server)
rougeronj
parents: 442
diff changeset
     3
 * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * Build: `lodash modern -o ./dist/lodash.js`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
456
a3bf10beb710 copy client change to server (grunt copy-server)
rougeronj
parents: 442
diff changeset
     8
 * Available under MIT license <https://lodash.com/license>
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
;(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  /** Used as a safe reference for `undefined` in pre ES5 environments */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  var undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
  /** Used to pool arrays and objects used internally */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  var arrayPool = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
      objectPool = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
  /** Used to generate unique IDs */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  var idCounter = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  /** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  var keyPrefix = +new Date + '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  /** Used as the size when optimizations are enabled for large arrays */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  var largeArraySize = 75;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
  /** Used as the max size of the `arrayPool` and `objectPool` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  var maxPoolSize = 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  /** Used to detect and test whitespace */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  var whitespace = (
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    // whitespace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    ' \t\x0B\f\xA0\ufeff' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    // line terminators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    '\n\r\u2028\u2029' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    // unicode category "Zs" space separators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
  );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
  /** Used to match empty string literals in compiled template source */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
  var reEmptyStringLeading = /\b__p \+= '';/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
   * Used to match ES6 template delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
   * http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
  /** Used to match regexp flags from their coerced string values */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
  var reFlags = /\w*$/;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
  /** Used to detected named functions */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
  var reFuncName = /^\s*function[ \n\r\t]+\w/;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
  /** Used to match "interpolate" template delimiters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
  var reInterpolate = /<%=([\s\S]+?)%>/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
  /** Used to match leading whitespace and zeros to be removed */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  /** Used to ensure capturing order of template delimiters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
  var reNoMatch = /($^)/;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
  /** Used to detect functions containing a `this` reference */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
  var reThis = /\bthis\b/;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
  /** Used to match unescaped characters in compiled string literals */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
  var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
  /** Used to assign default `context` object properties */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  var contextProps = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    'parseInt', 'setTimeout'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
  ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
  /** Used to make template sourceURLs easier to identify */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
  var templateCounter = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
  /** `Object#toString` result shortcuts */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
  var argsClass = '[object Arguments]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
      arrayClass = '[object Array]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
      boolClass = '[object Boolean]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
      dateClass = '[object Date]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
      funcClass = '[object Function]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
      numberClass = '[object Number]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
      objectClass = '[object Object]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
      regexpClass = '[object RegExp]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
      stringClass = '[object String]';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
  /** Used to identify object classifications that `_.clone` supports */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
  var cloneableClasses = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
  cloneableClasses[funcClass] = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
  cloneableClasses[boolClass] = cloneableClasses[dateClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
  cloneableClasses[numberClass] = cloneableClasses[objectClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
  /** Used as an internal `_.debounce` options object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
  var debounceOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    'leading': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    'maxWait': 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    'trailing': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
  /** Used as the property descriptor for `__bindData__` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
  var descriptor = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    'configurable': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    'enumerable': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    'value': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    'writable': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
  /** Used to determine if values are of the language type Object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
  var objectTypes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    'boolean': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    'function': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    'object': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    'number': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    'string': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
    'undefined': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
  /** Used to escape characters for inclusion in compiled string literals */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  var stringEscapes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    '\\': '\\',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    "'": "'",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    '\n': 'n',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    '\r': 'r',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    '\t': 't',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    '\u2028': 'u2028',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    '\u2029': 'u2029'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
  /** Used as a reference to the global object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
  var root = (objectTypes[typeof window] && window) || this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
  /** Detect free variable `exports` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
  /** Detect free variable `module` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
  /** Detect the popular CommonJS extension `module.exports` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
  /** Detect free variable `global` from Node.js or Browserified code and use it as `root` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  var freeGlobal = objectTypes[typeof global] && global;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
    root = freeGlobal;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
   * The base implementation of `_.indexOf` without support for binary searches
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
   * or `fromIndex` constraints.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
   * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
   * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
   * @param {number} [fromIndex=0] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
   * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
  function baseIndexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    var index = (fromIndex || 0) - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
      if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
        return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
    return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
   * An implementation of `_.contains` for cache objects that mimics the return
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
   * signature of `_.indexOf` by returning `0` if the value is found, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
   * @param {Object} cache The cache object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
   * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
   * @returns {number} Returns `0` if `value` is found, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
  function cacheIndexOf(cache, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
    var type = typeof value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
    cache = cache.cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    if (type == 'boolean' || value == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
      return cache[value] ? 0 : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    if (type != 'number' && type != 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
      type = 'object';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
    var key = type == 'number' ? value : keyPrefix + value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
    cache = (cache = cache[type]) && cache[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
    return type == 'object'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
      : (cache ? 0 : -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
   * Adds a given value to the corresponding cache object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
   * @param {*} value The value to add to the cache.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
  function cachePush(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    var cache = this.cache,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
        type = typeof value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    if (type == 'boolean' || value == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
      cache[value] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
    } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
      if (type != 'number' && type != 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
        type = 'object';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
      var key = type == 'number' ? value : keyPrefix + value,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
          typeCache = cache[type] || (cache[type] = {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
      if (type == 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        (typeCache[key] || (typeCache[key] = [])).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
        typeCache[key] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
   * Used by `_.max` and `_.min` as the default callback when a given
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
   * collection is a string value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
   * @param {string} value The character to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
   * @returns {number} Returns the code unit of given character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
  function charAtCallback(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
    return value.charCodeAt(0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
   * Used by `sortBy` to compare transformed `collection` elements, stable sorting
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
   * them in ascending order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
   * @param {Object} a The object to compare to `b`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
   * @param {Object} b The object to compare to `a`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
   * @returns {number} Returns the sort order indicator of `1` or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
  function compareAscending(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    var ac = a.criteria,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
        bc = b.criteria,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
        index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
        length = ac.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
      var value = ac[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
          other = bc[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
      if (value !== other) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        if (value > other || typeof value == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
          return 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        if (value < other || typeof other == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
          return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
    // that causes it, under certain circumstances, to return the same value for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
    //
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
    // This also ensures a stable sort in V8 and other engines.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
    // See http://code.google.com/p/v8/issues/detail?id=90
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    return a.index - b.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
   * Creates a cache object to optimize linear searches of large arrays.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
   * @param {Array} [array=[]] The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
   * @returns {null|Object} Returns the cache object or `null` if caching should not be used.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
  function createCache(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
    var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
        length = array.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        first = array[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        mid = array[(length / 2) | 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
        last = array[length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
    if (first && typeof first == 'object' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
        mid && typeof mid == 'object' && last && typeof last == 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
      return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
    var cache = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    var result = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    result.array = array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    result.cache = cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
    result.push = cachePush;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
      result.push(array[index]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
    return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
   * Used by `template` to escape characters for inclusion in compiled
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
   * string literals.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
   * @param {string} match The matched character to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
   * @returns {string} Returns the escaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
  function escapeStringChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
    return '\\' + stringEscapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
   * Gets an array from the array pool or creates a new one if the pool is empty.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
   * @returns {Array} The array from the pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
  function getArray() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
    return arrayPool.pop() || [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
   * Gets an object from the object pool or creates a new one if the pool is empty.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
   * @returns {Object} The object from the pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
  function getObject() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
    return objectPool.pop() || {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
      'array': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
      'cache': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
      'criteria': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
      'false': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
      'index': 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
      'null': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
      'number': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
      'object': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
      'push': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
      'string': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
      'true': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
      'undefined': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
      'value': null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
   * Releases the given array back to the array pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
   * @param {Array} [array] The array to release.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
  function releaseArray(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
    array.length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
    if (arrayPool.length < maxPoolSize) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
      arrayPool.push(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
   * Releases the given object back to the object pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
   * @param {Object} [object] The object to release.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
  function releaseObject(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
    var cache = object.cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
    if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
      releaseObject(cache);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
    object.array = object.cache = object.criteria = object.object = object.number = object.string = object.value = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
    if (objectPool.length < maxPoolSize) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
      objectPool.push(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
   * Slices the `collection` from the `start` index up to, but not including,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
   * the `end` index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
   * Note: This function is used instead of `Array#slice` to support node lists
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
   * in IE < 9 and to ensure dense arrays are returned.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
   * @param {Array|Object|string} collection The collection to slice.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
   * @param {number} start The start index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
   * @param {number} end The end index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
   * @returns {Array} Returns the new array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
  function slice(array, start, end) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
    start || (start = 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
    if (typeof end == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
      end = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
        length = end - start || 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
        result = Array(length < 0 ? 0 : length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
      result[index] = array[start + index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
    return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
   * Create a new `lodash` function using the given context object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
   * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
   * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
   * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
   * @param {Object} [context=root] The context object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
   * @returns {Function} Returns the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
  function runInContext(context) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
    // Avoid issues with some ES3 environments that attempt to use values, named
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
    // after built-in constructors like `Object`, for the creation of literals.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    // ES5 clears this up by stating that literals must use built-in constructors.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    // See http://es5.github.io/#x11.1.5.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
    /** Native constructor references */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    var Array = context.Array,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
        Boolean = context.Boolean,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
        Date = context.Date,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
        Function = context.Function,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
        Math = context.Math,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
        Number = context.Number,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
        Object = context.Object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        RegExp = context.RegExp,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
        String = context.String,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        TypeError = context.TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
     * Used for `Array` method references.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
     * Normally `Array.prototype` would suffice, however, using an array literal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
     * avoids issues in Narwhal.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
    var arrayRef = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
    /** Used for native method references */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
    var objectProto = Object.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
    /** Used to restore the original `_` reference in `noConflict` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
    var oldDash = context._;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
    /** Used to resolve the internal [[Class]] of values */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
    var toString = objectProto.toString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
    /** Used to detect if a method is native */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
    var reNative = RegExp('^' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
      String(toString)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
        .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
        .replace(/toString| for [^\]]+/g, '.*?') + '$'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
    );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
    /** Native method shortcuts */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
    var ceil = Math.ceil,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
        clearTimeout = context.clearTimeout,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
        floor = Math.floor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
        fnToString = Function.prototype.toString,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        hasOwnProperty = objectProto.hasOwnProperty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
        push = arrayRef.push,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
        setTimeout = context.setTimeout,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        splice = arrayRef.splice,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        unshift = arrayRef.unshift;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
    /** Used to set meta data on functions */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
    var defineProperty = (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
      // IE 8 only accepts DOM elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
        var o = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
            func = isNative(func = Object.defineProperty) && func,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
            result = func(o, o, o) && func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
      } catch(e) { }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
    }());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
    /* Native method shortcuts for methods with the same name as other `lodash` methods */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        nativeIsFinite = context.isFinite,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
        nativeIsNaN = context.isNaN,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
        nativeMax = Math.max,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
        nativeMin = Math.min,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
        nativeParseInt = context.parseInt,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
        nativeRandom = Math.random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
    /** Used to lookup a built-in constructor by [[Class]] */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    var ctorByClass = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
    ctorByClass[arrayClass] = Array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
    ctorByClass[boolClass] = Boolean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
    ctorByClass[dateClass] = Date;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
    ctorByClass[funcClass] = Function;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
    ctorByClass[objectClass] = Object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
    ctorByClass[numberClass] = Number;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
    ctorByClass[regexpClass] = RegExp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
    ctorByClass[stringClass] = String;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
     * Creates a `lodash` object which wraps the given value to enable intuitive
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
     * method chaining.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
     * In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
     * and `unshift`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
     * Chaining is supported in custom builds as long as the `value` method is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
     * implicitly or explicitly included in the build.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
     * The chainable wrapper functions are:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
     * and `zip`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
     * The non-chainable wrapper functions are:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
     * `template`, `unescape`, `uniqueId`, and `value`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
     * The wrapper functions `first` and `last` return wrapped values when `n` is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
     * provided, otherwise they return unwrapped values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
     * Explicit chaining can be enabled by using the `_.chain` method.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
     * @name _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
     * @constructor
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
     * @param {*} value The value to wrap in a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
     * @returns {Object} Returns a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
     * var wrapped = _([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
     * // returns an unwrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
     * wrapped.reduce(function(sum, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
     *   return sum + num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
     * // returns a wrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
     * var squares = wrapped.map(function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
     *   return num * num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
     * _.isArray(squares);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
     * _.isArray(squares.value());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
    function lodash(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
      // don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
       ? value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
       : new lodashWrapper(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
     * A fast path for creating `lodash` wrapper objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
     * @param {*} value The value to wrap in a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
     * @param {boolean} chainAll A flag to enable chaining for all methods
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
     * @returns {Object} Returns a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
    function lodashWrapper(value, chainAll) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
      this.__chain__ = !!chainAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
      this.__wrapped__ = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
    // ensure `new lodashWrapper` is an instance of `lodash`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
    lodashWrapper.prototype = lodash.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
     * An object used to flag environments features.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
     * @type Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
    var support = lodash.support = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
     * Detect if functions can be decompiled by `Function#toString`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
     * (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
     * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
     * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
    support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
     * Detect if `Function#name` is supported (all but IE).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
     * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
     * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
    support.funcNames = typeof Function.name == 'string';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
     * By default, the template delimiters used by Lo-Dash are similar to those in
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
     * embedded Ruby (ERB). Change the following template settings to use alternative
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
     * delimiters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
     * @type Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
    lodash.templateSettings = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
       * Used to detect `data` property values to be HTML-escaped.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
       * @type RegExp
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
      'escape': /<%-([\s\S]+?)%>/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
       * Used to detect code to be evaluated.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
       * @type RegExp
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
      'evaluate': /<%([\s\S]+?)%>/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
       * Used to detect `data` property values to inject.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
       * @type RegExp
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
      'interpolate': reInterpolate,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
       * Used to reference the data object in the template text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
       * @type string
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
      'variable': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
       * Used to import variables into the compiled template.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
       * @type Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
      'imports': {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
        /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
         * A reference to the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
         *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
         * @memberOf _.templateSettings.imports
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
         * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
         */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
        '_': lodash
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
     * The base implementation of `_.bind` that creates the bound function and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
     * sets its meta data.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
     * @param {Array} bindData The bind data array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
    function baseBind(bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
      var func = bindData[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
          partialArgs = bindData[2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
          thisArg = bindData[4];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
      function bound() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
        // `Function#bind` spec
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
        // http://es5.github.io/#x15.3.4.5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
        if (partialArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
          // avoid `arguments` object deoptimizations by using `slice` instead
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
          // of `Array.prototype.slice.call` and not assigning `arguments` to a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
          // variable as a ternary expression
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
          var args = slice(partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
          push.apply(args, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
        // mimic the constructor's `return` behavior
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
        // http://es5.github.io/#x13.2.2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
        if (this instanceof bound) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
          // ensure `new bound` is an instance of `func`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
          var thisBinding = baseCreate(func.prototype),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
              result = func.apply(thisBinding, args || arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
          return isObject(result) ? result : thisBinding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
        return func.apply(thisArg, args || arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
      setBindData(bound, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
      return bound;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
     * The base implementation of `_.clone` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
     * for `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
     * @param {*} value The value to clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
     * @param {boolean} [isDeep=false] Specify a deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
     * @param {Array} [stackA=[]] Tracks traversed source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
     * @param {Array} [stackB=[]] Associates clones with source counterparts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
     * @returns {*} Returns the cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
    function baseClone(value, isDeep, callback, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
        var result = callback(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
        if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
          return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
      // inspect [[Class]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
      var isObj = isObject(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
      if (isObj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
        var className = toString.call(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
        if (!cloneableClasses[className]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
          return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
        var ctor = ctorByClass[className];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
        switch (className) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
          case boolClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
          case dateClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
            return new ctor(+value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
          case numberClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
          case stringClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
            return new ctor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
          case regexpClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
            result = ctor(value.source, reFlags.exec(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
            result.lastIndex = value.lastIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
            return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
        return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
      var isArr = isArray(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
      if (isDeep) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
        // check for circular references and return corresponding clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
        var initedStack = !stackA;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
        stackA || (stackA = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
        stackB || (stackB = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
        var length = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
          if (stackA[length] == value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
            return stackB[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
        result = isArr ? ctor(value.length) : {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
      else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
        result = isArr ? slice(value) : assign({}, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
      // add array properties assigned by `RegExp#exec`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
      if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
        if (hasOwnProperty.call(value, 'index')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
          result.index = value.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
        if (hasOwnProperty.call(value, 'input')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
          result.input = value.input;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
      // exit for shallow clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
      if (!isDeep) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
      // add the source value to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
      // and associate it with its clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
      stackA.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
      stackB.push(result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
      // recursively populate clone (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
      (isArr ? forEach : forOwn)(value, function(objValue, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
      if (initedStack) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
        releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
        releaseArray(stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
     * The base implementation of `_.create` without support for assigning
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
     * properties to the created object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
     * @param {Object} prototype The object to inherit from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
     * @returns {Object} Returns the new object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
    function baseCreate(prototype, properties) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
      return isObject(prototype) ? nativeCreate(prototype) : {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
    // fallback for browsers without `Object.create`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
    if (!nativeCreate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
      baseCreate = (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
        function Object() {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
        return function(prototype) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
          if (isObject(prototype)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
            Object.prototype = prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
            var result = new Object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
            Object.prototype = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
          return result || context.Object();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
      }());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
     * The base implementation of `_.createCallback` without support for creating
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
     * "_.pluck" or "_.where" style callbacks.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
     * @param {*} [func=identity] The value to convert to a callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
     * @param {*} [thisArg] The `this` binding of the created callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
     * @param {number} [argCount] The number of arguments the callback accepts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
     * @returns {Function} Returns a callback function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
    function baseCreateCallback(func, thisArg, argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
      if (typeof func != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
        return identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
      // exit early for no `thisArg` or already bound by `Function#bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
      if (typeof thisArg == 'undefined' || !('prototype' in func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
        return func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
      var bindData = func.__bindData__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
      if (typeof bindData == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
        if (support.funcNames) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
          bindData = !func.name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
        bindData = bindData || !support.funcDecomp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
        if (!bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
          var source = fnToString.call(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
          if (!support.funcNames) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
            bindData = !reFuncName.test(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
          if (!bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
            // checks if `func` references the `this` keyword and stores the result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
            bindData = reThis.test(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
            setBindData(func, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
      // exit early if there are no `this` references or `func` is bound
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
      if (bindData === false || (bindData !== true && bindData[1] & 1)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
        return func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
      switch (argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
        case 1: return function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
          return func.call(thisArg, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
        case 2: return function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
          return func.call(thisArg, a, b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
        case 3: return function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
          return func.call(thisArg, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
        case 4: return function(accumulator, value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
          return func.call(thisArg, accumulator, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
      return bind(func, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
     * The base implementation of `createWrapper` that creates the wrapper and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
     * sets its meta data.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
     * @param {Array} bindData The bind data array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
    function baseCreateWrapper(bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
      var func = bindData[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
          bitmask = bindData[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
          partialArgs = bindData[2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
          partialRightArgs = bindData[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
          thisArg = bindData[4],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
          arity = bindData[5];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
      var isBind = bitmask & 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
          isBindKey = bitmask & 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
          isCurry = bitmask & 4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
          isCurryBound = bitmask & 8,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
          key = func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
      function bound() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
        var thisBinding = isBind ? thisArg : this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
        if (partialArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
          var args = slice(partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
          push.apply(args, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
        if (partialRightArgs || isCurry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
          args || (args = slice(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
          if (partialRightArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
            push.apply(args, partialRightArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
          if (isCurry && args.length < arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
            bitmask |= 16 & ~32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
        args || (args = arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
        if (isBindKey) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
          func = thisBinding[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
        if (this instanceof bound) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
          thisBinding = baseCreate(func.prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
          var result = func.apply(thisBinding, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
          return isObject(result) ? result : thisBinding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
        return func.apply(thisBinding, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
      setBindData(bound, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
      return bound;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
     * The base implementation of `_.difference` that accepts a single array
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
     * of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
     * @param {Array} [values] The array of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
    function baseDifference(array, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
          isLarge = length >= largeArraySize && indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
        var cache = createCache(values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
        if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
          indexOf = cacheIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
          values = cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
          isLarge = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
        if (indexOf(values, value) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
        releaseObject(values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
     * The base implementation of `_.flatten` without support for callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
     * shorthands or `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
     * @param {Array} array The array to flatten.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
     * @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
     * @param {number} [fromIndex=0] The index to start from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
     * @returns {Array} Returns a new flattened array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
    function baseFlatten(array, isShallow, isStrict, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
      var index = (fromIndex || 0) - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
        if (value && typeof value == 'object' && typeof value.length == 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
            && (isArray(value) || isArguments(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
          // recursively flatten arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
          if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
            value = baseFlatten(value, isShallow, isStrict);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
          var valIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
              valLength = value.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
              resIndex = result.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
          result.length += valLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
          while (++valIndex < valLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
            result[resIndex++] = value[valIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
        } else if (!isStrict) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
     * The base implementation of `_.isEqual`, without support for `thisArg` binding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
     * that allows partial "_.where" style comparisons.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
     * @param {*} a The value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
     * @param {*} b The other value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
     * @param {Function} [callback] The function to customize comparing values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
     * @param {Array} [stackA=[]] Tracks traversed `a` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
     * @param {Array} [stackB=[]] Tracks traversed `b` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
      // used to indicate that when comparing objects, `a` has at least the properties of `b`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
        var result = callback(a, b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
        if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
          return !!result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
      // exit early for identical values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
      if (a === b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
        // treat `+0` vs. `-0` as not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
        return a !== 0 || (1 / a == 1 / b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
      var type = typeof a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
          otherType = typeof b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
      // exit early for unlike primitive values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
      if (a === a &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
          !(a && objectTypes[type]) &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
          !(b && objectTypes[otherType])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
      // exit early for `null` and `undefined` avoiding ES3's Function#call behavior
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
      // http://es5.github.io/#x15.3.4.4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
      if (a == null || b == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
        return a === b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
      // compare [[Class]] names
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
      var className = toString.call(a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
          otherClass = toString.call(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
      if (className == argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
        className = objectClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
      if (otherClass == argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
        otherClass = objectClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
      if (className != otherClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
      switch (className) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
        case boolClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
        case dateClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
          // coerce dates and booleans to numbers, dates to milliseconds and booleans
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
          return +a == +b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
        case numberClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
          // treat `NaN` vs. `NaN` as equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
          return (a != +a)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
            ? b != +b
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
            // but treat `+0` vs. `-0` as not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
            : (a == 0 ? (1 / a == 1 / b) : a == +b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
        case regexpClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
        case stringClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
          // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
          // treat string primitives and their corresponding object instances as equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
          return a == String(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
      var isArr = className == arrayClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
      if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
        // unwrap any `lodash` wrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
            bWrapped = hasOwnProperty.call(b, '__wrapped__');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
        if (aWrapped || bWrapped) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
          return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
        // exit for functions and DOM nodes
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
        if (className != objectClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
        // in older versions of Opera, `arguments` objects have `Array` constructors
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
        var ctorA = a.constructor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
            ctorB = b.constructor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
        // non `Object` object instances with different constructors are not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
        if (ctorA != ctorB &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
              ('constructor' in a && 'constructor' in b)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
            ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
      // assume cyclic structures are equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
      // the algorithm for detecting cyclic structures is adapted from ES 5.1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
      // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
      var initedStack = !stackA;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
      stackA || (stackA = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
      stackB || (stackB = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
      var length = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
        if (stackA[length] == a) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
          return stackB[length] == b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
      var size = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
      result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
      // add `a` and `b` to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
      stackA.push(a);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
      stackB.push(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
      // recursively compare objects and arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
      if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
        // compare lengths to determine if a deep comparison is necessary
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
        length = a.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
        size = b.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
        result = size == length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
        if (result || isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
          // deep compare the contents, ignoring non-numeric properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
          while (size--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
            var index = length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
                value = b[size];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
            if (isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
              while (index--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
                  break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
                }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
              }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
              break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
      else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
        // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
        // which, in this case, is more costly
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
        forIn(b, function(value, key, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
          if (hasOwnProperty.call(b, key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
            // count the number of properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
            size++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
            // deep compare each property value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
            return (result = hasOwnProperty.call(a, key) && baseIsEqual(a[key], value, callback, isWhere, stackA, stackB));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
        if (result && !isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
          // ensure both objects have the same number of properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
          forIn(a, function(value, key, a) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
            if (hasOwnProperty.call(a, key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
              // `size` will be `-1` if `a` has more properties than `b`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
              return (result = --size > -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
          });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
      stackA.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
      stackB.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
      if (initedStack) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
        releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
        releaseArray(stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
     * The base implementation of `_.merge` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
     * for `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
     * @param {Object} source The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
     * @param {Function} [callback] The function to customize merging properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
     * @param {Array} [stackA=[]] Tracks traversed source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
     * @param {Array} [stackB=[]] Associates values with source counterparts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
    function baseMerge(object, source, callback, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
      (isArray(source) ? forEach : forOwn)(source, function(source, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
        var found,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
            isArr,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
            result = source,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
            value = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
          // avoid merging previously merged cyclic sources
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
          var stackLength = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
          while (stackLength--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
            if ((found = stackA[stackLength] == source)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
              value = stackB[stackLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
              break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
          if (!found) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
            var isShallow;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
            if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
              result = callback(value, source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
              if ((isShallow = typeof result != 'undefined')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
                value = result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
              }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
            if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
              value = isArr
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
                ? (isArray(value) ? value : [])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
                : (isPlainObject(value) ? value : {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
            // add `source` and associated `value` to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
            stackA.push(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
            stackB.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
            // recursively merge objects and arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
            if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
              baseMerge(value, source, callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
        else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
          if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
            result = callback(value, source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
            if (typeof result == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
              result = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
          if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
            value = result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
        object[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
     * The base implementation of `_.random` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
     * for returning floating-point numbers.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
     * @param {number} min The minimum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
     * @param {number} max The maximum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
     * @returns {number} Returns a random number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
    function baseRandom(min, max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
      return min + floor(nativeRandom() * (max - min + 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
     * The base implementation of `_.uniq` without support for callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
     * or `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
     * @param {Function} [callback] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
     * @returns {Array} Returns a duplicate-value-free array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
    function baseUniq(array, isSorted, callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
          seen = (callback || isLarge) ? getArray() : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
        var cache = createCache(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
        indexOf = cacheIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
        seen = cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
        var value = array[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
            computed = callback ? callback(value, index, array) : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
        if (isSorted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
              ? !index || seen[seen.length - 1] !== computed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
              : indexOf(seen, computed) < 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
            ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
          if (callback || isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
            seen.push(computed);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
        releaseArray(seen.array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
        releaseObject(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
      } else if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
        releaseArray(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
     * Creates a function that aggregates a collection, creating an object composed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
     * of keys generated from the results of running each element of the collection
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
     * through a callback. The given `setter` function sets the keys and values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
     * of the composed object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
     * @param {Function} setter The setter function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
     * @returns {Function} Returns the new aggregator function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
    function createAggregator(setter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
      return function(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
        var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
            length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
        if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
          while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
            var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
            setter(result, value, callback(value, index, collection), collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
          forOwn(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
            setter(result, value, callback(value, key, collection), collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
          });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
     * Creates a function that, when called, either curries or invokes `func`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
     * with an optional `this` binding and partially applied arguments.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
     * @param {Function|string} func The function or method name to reference.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
     * @param {number} bitmask The bitmask of method flags to compose.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
     *  The bitmask may be composed of the following flags:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
     *  1 - `_.bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
     *  2 - `_.bindKey`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
     *  4 - `_.curry`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
     *  8 - `_.curry` (bound)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
     *  16 - `_.partial`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
     *  32 - `_.partialRight`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
     * @param {Array} [partialArgs] An array of arguments to prepend to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
     *  provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
     * @param {Array} [partialRightArgs] An array of arguments to append to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
     *  provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
     * @param {*} [thisArg] The `this` binding of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
     * @param {number} [arity] The arity of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
      var isBind = bitmask & 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
          isBindKey = bitmask & 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
          isCurry = bitmask & 4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
          isCurryBound = bitmask & 8,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
          isPartial = bitmask & 16,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
          isPartialRight = bitmask & 32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
      if (!isBindKey && !isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
      if (isPartial && !partialArgs.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
        bitmask &= ~16;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
        isPartial = partialArgs = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
      if (isPartialRight && !partialRightArgs.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
        bitmask &= ~32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
        isPartialRight = partialRightArgs = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
      var bindData = func && func.__bindData__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
      if (bindData && bindData !== true) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
        // clone `bindData`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
        bindData = slice(bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1417
        if (bindData[2]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
          bindData[2] = slice(bindData[2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
        if (bindData[3]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
          bindData[3] = slice(bindData[3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
        // set `thisBinding` is not previously bound
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
        if (isBind && !(bindData[1] & 1)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
          bindData[4] = thisArg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
        // set if previously bound but not currently (subsequent curried functions)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
        if (!isBind && bindData[1] & 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
          bitmask |= 8;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
        // set curried arity if not yet set
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
        if (isCurry && !(bindData[1] & 4)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
          bindData[5] = arity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
        // append partial left arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
        if (isPartial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
          push.apply(bindData[2] || (bindData[2] = []), partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
        // append partial right arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
        if (isPartialRight) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
        // merge flags
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
        bindData[1] |= bitmask;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
        return createWrapper.apply(null, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
      // fast path for `_.bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
     * Used by `escape` to convert characters to HTML entities.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
     * @param {string} match The matched character to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
     * @returns {string} Returns the escaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
    function escapeHtmlChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
      return htmlEscapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
     * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
     * customized, this method returns the custom method, otherwise it returns
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
     * the `baseIndexOf` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
     * @returns {Function} Returns the "indexOf" function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
    function getIndexOf() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
     * Checks if `value` is a native function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
     * @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
    function isNative(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
      return typeof value == 'function' && reNative.test(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
     * Sets `this` binding data on a given function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
     * @param {Function} func The function to set data on.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
     * @param {Array} value The data array to set.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
    var setBindData = !defineProperty ? noop : function(func, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
      descriptor.value = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
      defineProperty(func, '__bindData__', descriptor);
456
a3bf10beb710 copy client change to server (grunt copy-server)
rougeronj
parents: 442
diff changeset
  1497
      descriptor.value = null;
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
     * A fallback implementation of `isPlainObject` which checks if a given value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
     * is an object created by the `Object` constructor, assuming objects created
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
     * by the `Object` constructor have no inherited enumerable properties and that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
     * there are no `Object.prototype` extensions.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
    function shimIsPlainObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
      var ctor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
      // avoid non Object objects, `arguments` objects, and DOM elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
      if (!(value && toString.call(value) == objectClass) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
      // In most environments an object's own properties are iterated before
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
      // its inherited properties. If the last iterated property is an object's
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
      // own property then there are no inherited enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
      forIn(value, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
        result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
      return typeof result == 'undefined' || hasOwnProperty.call(value, result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
     * Used by `unescape` to convert HTML entities to characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1531
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
     * @param {string} match The matched character to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
     * @returns {string} Returns the unescaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
    function unescapeHtmlChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
      return htmlUnescapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
     * Checks if `value` is an `arguments` object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
     * @returns {boolean} Returns `true` if the `value` is an `arguments` object, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
     * (function() { return _.isArguments(arguments); })(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1554
     * _.isArguments([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
    function isArguments(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
        toString.call(value) == argsClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
     * Checks if `value` is an array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
     * @returns {boolean} Returns `true` if the `value` is an array, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
     * (function() { return _.isArray(arguments); })();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
     * _.isArray([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
    var isArray = nativeIsArray || function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
        toString.call(value) == arrayClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
     * A fallback implementation of `Object.keys` which produces an array of the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
     * given object's own enumerable property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
     * @returns {Array} Returns an array of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
    var shimKeys = function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
      var index, iterable = object, result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
      if (!iterable) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
      if (!(objectTypes[typeof object])) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
        for (index in iterable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
          if (hasOwnProperty.call(iterable, index)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
            result.push(index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
      return result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
     * Creates an array composed of the own enumerable property names of an object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
     * @returns {Array} Returns an array of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
    var keys = !nativeKeys ? shimKeys : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
        return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
      return nativeKeys(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
     * Used to convert characters to HTML entities:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
     * Though the `>` character is escaped for symmetry, characters like `>` and `/`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
     * don't require escaping in HTML and have no special meaning unless they're part
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
     * of a tag or an unquoted attribute value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
     * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
    var htmlEscapes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
      '&': '&amp;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
      '<': '&lt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
      '>': '&gt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
      '"': '&quot;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
      "'": '&#39;'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
    /** Used to convert HTML entities to characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
    var htmlUnescapes = invert(htmlEscapes);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
    /** Used to match HTML entities and HTML characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
     * object. Subsequent sources will overwrite property assignments of previous
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
     * sources. If a callback is provided it will be executed to produce the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
     * assigned values. The callback is bound to `thisArg` and invoked with two
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
     * arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
     * @alias extend
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
     * @param {Function} [callback] The function to customize assigning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
     * // => { 'name': 'fred', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
     * var defaults = _.partialRight(_.assign, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
     *   return typeof a == 'undefined' ? b : a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
     * defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
     * // => { 'name': 'barney', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
    var assign = function(object, source, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
      var index, iterable = object, result = iterable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
      if (!iterable) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
          argsIndex = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
          argsLength = typeof guard == 'number' ? 2 : args.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
      if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
        var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
      } else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
        callback = args[--argsLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
        iterable = args[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
        if (iterable && objectTypes[typeof iterable]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
        var ownIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
            ownProps = objectTypes[typeof iterable] && keys(iterable),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
            length = ownProps ? ownProps.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
        while (++ownIndex < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
          index = ownProps[ownIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
          result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
      return result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
     * Creates a clone of `value`. If `isDeep` is `true` nested objects will also
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
     * be cloned, otherwise they will be assigned by reference. If a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
     * is provided it will be executed to produce the cloned values. If the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
     * callback returns `undefined` cloning will be handled by the method instead.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
     * The callback is bound to `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
     * @param {*} value The value to clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
     * @param {boolean} [isDeep=false] Specify a deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
     * @returns {*} Returns the cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
     * var shallow = _.clone(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
     * shallow[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
     * var deep = _.clone(characters, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
     * _.mixin({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
     *   'clone': _.partialRight(_.clone, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
     *     return _.isElement(value) ? value.cloneNode(false) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
     *   })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
     * var clone = _.clone(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
     * clone.childNodes.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
    function clone(value, isDeep, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
      // allows working with "Collections" methods without using their `index`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
      // and `collection` arguments for `isDeep` and `callback`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
      if (typeof isDeep != 'boolean' && isDeep != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
        callback = isDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
        isDeep = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
     * Creates a deep clone of `value`. If a callback is provided it will be
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
     * executed to produce the cloned values. If the callback returns `undefined`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
     * cloning will be handled by the method instead. The callback is bound to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
     * `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
     * Note: This method is loosely based on the structured clone algorithm. Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
     * and DOM nodes are **not** cloned. The enumerable properties of `arguments` objects and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
     * objects created by constructors other than `Object` are cloned to plain `Object` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
     * See http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
     * @param {*} value The value to deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
     * @returns {*} Returns the deep cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1782
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1783
     * var deep = _.cloneDeep(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1786
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1787
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
     *   'node': element
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1790
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1791
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1792
     * var clone = _.cloneDeep(view, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1793
     *   return _.isElement(value) ? value.cloneNode(true) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1794
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1795
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1796
     * clone.node == view.node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1797
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1798
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1799
    function cloneDeep(value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1800
      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1801
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1802
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1803
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1804
     * Creates an object that inherits from the given `prototype` object. If a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1805
     * `properties` object is provided its own enumerable properties are assigned
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1806
     * to the created object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1807
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1808
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1809
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1810
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1811
     * @param {Object} prototype The object to inherit from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1812
     * @param {Object} [properties] The properties to assign to the object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1813
     * @returns {Object} Returns the new object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1814
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1815
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1816
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1817
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1818
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1819
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1820
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1821
     * function Circle() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1822
     *   Shape.call(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1823
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1824
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
     * var circle = new Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
     * circle instanceof Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
     * circle instanceof Shape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1832
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1833
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
    function create(prototype, properties) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
      var result = baseCreate(prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
      return properties ? assign(result, properties) : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
     * object for all destination properties that resolve to `undefined`. Once a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
     * property is set, additional defaults of the same property will be ignored.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1843
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1844
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1847
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
     * @param- {Object} [guard] Allows working with `_.reduce` without using its
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
     *  `key` and `object` arguments as sources.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1856
     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1857
     * // => { 'name': 'barney', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
    var defaults = function(object, source, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
      var index, iterable = object, result = iterable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
      if (!iterable) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1862
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1863
          argsIndex = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1864
          argsLength = typeof guard == 'number' ? 2 : args.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
        iterable = args[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
        if (iterable && objectTypes[typeof iterable]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
        var ownIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
            ownProps = objectTypes[typeof iterable] && keys(iterable),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
            length = ownProps ? ownProps.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
        while (++ownIndex < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1873
          index = ownProps[ownIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1874
          if (typeof result[index] == 'undefined') result[index] = iterable[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1875
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1876
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1877
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
      return result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
     * This method is like `_.findIndex` except that it returns the key of the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
     * first element that passes the callback check, instead of the element itself.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1884
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1885
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1891
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1892
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
     *  iteration. If a property name or object is provided it will be used to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
     * @returns {string|undefined} Returns the key of the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1902
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1903
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1904
     *   'barney': {  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1905
     *   'fred': {    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
     *   'pebbles': { 'age': 1,  'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
     * _.findKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
     * // => 'barney' (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1913
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1914
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
     * _.findKey(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1917
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1918
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
     * _.findKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
     * // => 'fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
    function findKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1925
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1926
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1927
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1928
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1929
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1930
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1934
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1935
     * This method is like `_.findKey` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1940
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1941
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1942
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1943
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1944
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1945
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1946
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1947
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1948
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
     *  iteration. If a property name or object is provided it will be used to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
     * @returns {string|undefined} Returns the key of the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
     *   'barney': {  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
     *   'fred': {    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
     *   'pebbles': { 'age': 1,  'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
     * _.findLastKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1964
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1965
     * // => returns `pebbles`, assuming `_.findKey` returns `barney`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1966
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
     * _.findLastKey(characters, { 'age': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
     * // => 'fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
     * _.findLastKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1974
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1975
    function findLastKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
      forOwnRight(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
     * Iterates over own and inherited enumerable properties of an object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1989
     * executing the callback for each property. The callback is bound to `thisArg`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1990
     * and invoked with three arguments; (value, key, object). Callbacks may exit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
     * iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1995
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1996
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1997
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2001
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2002
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
     *   this.y += y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2011
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2012
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
     * _.forIn(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
     * // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
    var forIn = function(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2019
      var index, iterable = collection, result = iterable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2020
      if (!iterable) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
      if (!objectTypes[typeof iterable]) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
        for (index in iterable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2024
          if (callback(iterable[index], index, collection) === false) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2025
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2026
      return result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
     * This method is like `_.forIn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2032
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2033
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2035
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2036
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2037
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2038
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2041
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2042
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2043
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
     *   this.y += y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
     * _.forInRight(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2055
     * // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2056
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2057
    function forInRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2058
      var pairs = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2059
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2060
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2061
        pairs.push(key, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2062
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2063
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2064
      var length = pairs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2065
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2066
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2067
        if (callback(pairs[length--], pairs[length], object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2068
          break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2069
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2070
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2071
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2072
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2073
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2074
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2075
     * Iterates over own enumerable properties of an object, executing the callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2076
     * for each property. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2077
     * arguments; (value, key, object). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2078
     * explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2079
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2080
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2081
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2082
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2083
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2084
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2085
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2086
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2087
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2088
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2089
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2090
     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2091
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2092
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2093
     * // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2094
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2095
    var forOwn = function(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2096
      var index, iterable = collection, result = iterable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2097
      if (!iterable) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2098
      if (!objectTypes[typeof iterable]) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2099
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2100
        var ownIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2101
            ownProps = objectTypes[typeof iterable] && keys(iterable),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2102
            length = ownProps ? ownProps.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2103
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2104
        while (++ownIndex < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
          index = ownProps[ownIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
          if (callback(iterable[index], index, collection) === false) return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
      return result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2109
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
     * This method is like `_.forOwn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2114
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2115
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2116
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
     * // => logs 'length', '1', and '0' assuming `_.forOwn` logs '0', '1', and 'length'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
    function forOwnRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2130
      var props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2131
          length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2132
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2133
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2134
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2135
        var key = props[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2136
        if (callback(object[key], key, object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
          break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2138
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2139
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2140
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2141
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2142
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
     * Creates a sorted array of property names of all enumerable properties,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
     * own and inherited, of `object` that have function values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
     * @alias methods
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
     * @returns {Array} Returns an array of property names that have function values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2154
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2155
     * _.functions(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2156
     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
    function functions(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
        if (isFunction(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
          result.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2163
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2164
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2165
      return result.sort();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2167
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2168
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2169
     * Checks if the specified property name exists as a direct property of `object`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
     * instead of an inherited property.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2171
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2172
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2175
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2176
     * @param {string} key The name of the property to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2177
     * @returns {boolean} Returns `true` if key is a direct property, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2178
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2179
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
    function has(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
      return object ? hasOwnProperty.call(object, key) : false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
     * Creates an object composed of the inverted keys and values of the given object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2193
     * @param {Object} object The object to invert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2194
     * @returns {Object} Returns the created inverted object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2196
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2197
     * _.invert({ 'first': 'fred', 'second': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2198
     * // => { 'fred': 'first', 'barney': 'second' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2199
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2200
    function invert(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
        result[object[key]] = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2211
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2212
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2213
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
     * Checks if `value` is a boolean value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2216
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2217
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
     * @returns {boolean} Returns `true` if the `value` is a boolean value, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
     * _.isBoolean(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
    function isBoolean(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
      return value === true || value === false ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
        value && typeof value == 'object' && toString.call(value) == boolClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2231
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2232
     * Checks if `value` is a date.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2233
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2234
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2235
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2236
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2237
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2238
     * @returns {boolean} Returns `true` if the `value` is a date, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2239
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2240
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2241
     * _.isDate(new Date);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2242
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2243
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2244
    function isDate(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
      return value && typeof value == 'object' && toString.call(value) == dateClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
     * Checks if `value` is a DOM element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2251
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2252
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2254
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2255
     * @returns {boolean} Returns `true` if the `value` is a DOM element, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
     * _.isElement(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2260
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2261
    function isElement(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2262
      return value && value.nodeType === 1 || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2265
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
     * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
     * length of `0` and objects with no own enumerable properties are considered
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
     * "empty".
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
     * @param {Array|Object|string} value The value to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
     * _.isEmpty([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
     * _.isEmpty({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2282
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2283
     * _.isEmpty('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2284
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2285
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2286
    function isEmpty(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2287
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2288
      if (!value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2290
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2291
      var className = toString.call(value),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2292
          length = value.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2293
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2294
      if ((className == arrayClass || className == stringClass || className == argsClass ) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2296
        return !length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2297
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2298
      forOwn(value, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
        return (result = false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2304
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2305
     * Performs a deep comparison between two values to determine if they are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
     * equivalent to each other. If a callback is provided it will be executed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2307
     * to compare values. If the callback returns `undefined` comparisons will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2308
     * be handled by the method instead. The callback is bound to `thisArg` and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
     * invoked with two arguments; (a, b).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2314
     * @param {*} a The value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2315
     * @param {*} b The other value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
     * @param {Function} [callback] The function to customize comparing values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
     * var copy = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2323
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2324
     * object == copy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
     * _.isEqual(object, copy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
     * var words = ['hello', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
     * var otherWords = ['hi', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
     * _.isEqual(words, otherWords, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
     *   var reGreet = /^(?:hello|hi)$/i,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
     *       aGreet = _.isString(a) && reGreet.test(a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2336
     *       bGreet = _.isString(b) && reGreet.test(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2337
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2339
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2340
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2341
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
    function isEqual(a, b, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2343
      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2344
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2345
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2346
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
     * Checks if `value` is, or can be coerced to, a finite number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
     * Note: This is not the same as native `isFinite` which will return true for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
     * booleans and empty strings. See http://es5.github.io/#x15.1.2.5.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
     * _.isFinite(-101);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2360
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2361
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
     * _.isFinite('10');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2364
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2365
     * _.isFinite(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2366
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
     * _.isFinite('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2370
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2371
     * _.isFinite(Infinity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2373
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2374
    function isFinite(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2375
      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2376
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2378
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2379
     * Checks if `value` is a function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
     * @returns {boolean} Returns `true` if the `value` is a function, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2386
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2387
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2388
     * _.isFunction(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
    function isFunction(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2392
      return typeof value == 'function';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2393
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
     * Checks if `value` is the language type of Object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2397
     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2398
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2402
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2403
     * @returns {boolean} Returns `true` if the `value` is an object, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2405
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2406
     * _.isObject({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2408
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2409
     * _.isObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2410
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
     * _.isObject(1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2413
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2414
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2415
    function isObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2416
      // check if the value is the ECMAScript language type of Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2417
      // http://es5.github.io/#x8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2418
      // and avoid a V8 bug
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2419
      // http://code.google.com/p/v8/issues/detail?id=2291
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2420
      return !!(value && objectTypes[typeof value]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2421
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2422
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2423
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2424
     * Checks if `value` is `NaN`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2425
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2426
     * Note: This is not the same as native `isNaN` which will return `true` for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2427
     * `undefined` and other non-numeric values. See http://es5.github.io/#x15.1.2.4.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2428
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2429
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2430
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2431
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2432
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2433
     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2434
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2435
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2436
     * _.isNaN(NaN);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2437
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2438
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2439
     * _.isNaN(new Number(NaN));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2440
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2441
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2442
     * isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2443
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2444
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2445
     * _.isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2446
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2447
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2448
    function isNaN(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2449
      // `NaN` as a primitive is the only value that is not equal to itself
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2450
      // (perform the [[Class]] check first to avoid errors with some host objects in IE)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2451
      return isNumber(value) && value != +value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2452
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2453
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2454
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2455
     * Checks if `value` is `null`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2456
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2458
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2459
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2460
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2461
     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2462
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2463
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2464
     * _.isNull(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2465
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2466
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2467
     * _.isNull(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2468
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2469
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2470
    function isNull(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2471
      return value === null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2472
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2473
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2474
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2475
     * Checks if `value` is a number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2476
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2477
     * Note: `NaN` is considered a number. See http://es5.github.io/#x8.5.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2478
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2479
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2480
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2481
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2482
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2483
     * @returns {boolean} Returns `true` if the `value` is a number, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2484
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2485
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2486
     * _.isNumber(8.4 * 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2487
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2488
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
    function isNumber(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
      return typeof value == 'number' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
        value && typeof value == 'object' && toString.call(value) == numberClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
     * Checks if `value` is an object created by the `Object` constructor.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2496
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2497
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2499
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2500
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2501
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2502
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2503
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2504
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
     * _.isPlainObject(new Shape);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2510
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2511
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2512
     * _.isPlainObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2514
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2515
     * _.isPlainObject({ 'x': 0, 'y': 0 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2517
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2518
    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2519
      if (!(value && toString.call(value) == objectClass)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2520
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2521
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2522
      var valueOf = value.valueOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
      return objProto
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
        ? (value == objProto || getPrototypeOf(value) == objProto)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
        : shimIsPlainObject(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2528
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2529
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
     * Checks if `value` is a regular expression.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2533
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2534
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2535
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2536
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2537
     * @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2538
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2539
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2540
     * _.isRegExp(/fred/);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
    function isRegExp(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2544
      return value && typeof value == 'object' && toString.call(value) == regexpClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2545
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2546
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2547
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2548
     * Checks if `value` is a string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2549
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2550
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2551
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2552
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2553
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2554
     * @returns {boolean} Returns `true` if the `value` is a string, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2555
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2556
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2557
     * _.isString('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2558
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2559
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2560
    function isString(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2561
      return typeof value == 'string' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2562
        value && typeof value == 'object' && toString.call(value) == stringClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2563
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2564
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2565
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2566
     * Checks if `value` is `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2567
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2568
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2569
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2570
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2571
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2572
     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2573
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2574
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2575
     * _.isUndefined(void 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2576
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2577
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
    function isUndefined(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2579
      return typeof value == 'undefined';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2580
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2581
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2582
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2583
     * Creates an object with the same keys as `object` and values generated by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
     * running each own enumerable property of `object` through the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2588
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2589
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2591
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2592
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2593
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2594
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2595
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2596
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2597
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2598
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2599
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2600
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2601
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2602
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2603
     * @returns {Array} Returns a new object with values of the results of each `callback` execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2604
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2605
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2606
     * _.mapValues({ 'a': 1, 'b': 2, 'c': 3} , function(num) { return num * 3; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2607
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2608
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2609
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2610
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2611
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2612
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2613
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2614
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2615
     * _.mapValues(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2616
     * // => { 'fred': 40, 'pebbles': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2617
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2618
    function mapValues(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2619
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2620
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2621
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2622
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2623
        result[key] = callback(value, key, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2624
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2625
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2626
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2627
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2628
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2629
     * Recursively merges own enumerable properties of the source object(s), that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2630
     * don't resolve to `undefined` into the destination object. Subsequent sources
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2631
     * will overwrite property assignments of previous sources. If a callback is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2632
     * provided it will be executed to produce the merged values of the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2633
     * and source properties. If the callback returns `undefined` merging will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2634
     * be handled by the method instead. The callback is bound to `thisArg` and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2635
     * invoked with two arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2636
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2637
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2638
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2639
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2640
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2641
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2642
     * @param {Function} [callback] The function to customize merging properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2643
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2644
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2645
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2646
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2647
     * var names = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2648
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2649
     *     { 'name': 'barney' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2650
     *     { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2651
     *   ]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2652
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2653
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2654
     * var ages = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2655
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2656
     *     { 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2657
     *     { 'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2658
     *   ]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2659
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2660
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2661
     * _.merge(names, ages);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2662
     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2663
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2664
     * var food = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2665
     *   'fruits': ['apple'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2666
     *   'vegetables': ['beet']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2667
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2668
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2669
     * var otherFood = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2670
     *   'fruits': ['banana'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2671
     *   'vegetables': ['carrot']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2672
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2673
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2674
     * _.merge(food, otherFood, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2675
     *   return _.isArray(a) ? a.concat(b) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2676
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2677
     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2678
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2679
    function merge(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2680
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2681
          length = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2682
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2683
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2684
        return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2685
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2686
      // allows working with `_.reduce` and `_.reduceRight` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2687
      // their `index` and `collection` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2688
      if (typeof args[2] != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2689
        length = args.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2690
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2691
      if (length > 3 && typeof args[length - 2] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2692
        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2693
      } else if (length > 2 && typeof args[length - 1] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2694
        callback = args[--length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2695
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2696
      var sources = slice(arguments, 1, length),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2697
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2698
          stackA = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2699
          stackB = getArray();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2700
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2701
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2702
        baseMerge(object, sources[index], callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2703
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2704
      releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2705
      releaseArray(stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2706
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2707
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2709
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2710
     * Creates a shallow clone of `object` excluding the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2711
     * Property names may be specified as individual arguments or as arrays of
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2712
     * property names. If a callback is provided it will be executed for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2713
     * property of `object` omitting the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2714
     * for. The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2715
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2716
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2717
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2718
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2719
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2720
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2721
     * @param {Function|...string|string[]} [callback] The properties to omit or the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2722
     *  function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2723
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2724
     * @returns {Object} Returns an object without the omitted properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2725
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2726
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2727
     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2728
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2729
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2730
     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2731
     *   return typeof value == 'number';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2732
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2733
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2734
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2735
    function omit(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2736
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2737
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2738
        var props = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2739
        forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2740
          props.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2741
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2742
        props = baseDifference(props, baseFlatten(arguments, true, false, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2743
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2744
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2745
            length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2746
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2747
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2748
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2749
          result[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2750
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2751
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2752
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2753
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2754
          if (!callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2755
            result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2756
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2757
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2758
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2759
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2760
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2761
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2762
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2763
     * Creates a two dimensional array of an object's key-value pairs,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2764
     * i.e. `[[key1, value1], [key2, value2]]`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2765
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2766
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2767
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2768
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2769
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2770
     * @returns {Array} Returns new array of key-value pairs.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2771
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2772
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2773
     * _.pairs({ 'barney': 36, 'fred': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2774
     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2775
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2776
    function pairs(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2777
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2778
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2779
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2780
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2781
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2782
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2783
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2784
        result[index] = [key, object[key]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2785
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2786
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2787
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2788
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2789
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2790
     * Creates a shallow clone of `object` composed of the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2791
     * Property names may be specified as individual arguments or as arrays of
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2792
     * property names. If a callback is provided it will be executed for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2793
     * property of `object` picking the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2794
     * for. The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2795
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2796
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2797
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2798
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2799
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2800
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2801
     * @param {Function|...string|string[]} [callback] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2802
     *  iteration or property names to pick, specified as individual property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2803
     *  names or arrays of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2804
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2805
     * @returns {Object} Returns an object composed of the picked properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2806
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2807
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2808
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2809
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2810
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2811
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2812
     *   return key.charAt(0) != '_';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2813
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2814
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2815
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2816
    function pick(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2817
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2818
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2819
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2820
            props = baseFlatten(arguments, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2821
            length = isObject(object) ? props.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2822
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2823
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2824
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2825
          if (key in object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2826
            result[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2827
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2828
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2829
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2830
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2831
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2832
          if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2833
            result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2834
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2835
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2836
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2837
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2838
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2839
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2840
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2841
     * An alternative to `_.reduce` this method transforms `object` to a new
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2842
     * `accumulator` object which is the result of running each of its own
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2843
     * enumerable properties through a callback, with each callback execution
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2844
     * potentially mutating the `accumulator` object. The callback is bound to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2845
     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2846
     * Callbacks may exit iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2847
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2848
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2849
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2850
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2851
     * @param {Array|Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2852
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2853
     * @param {*} [accumulator] The custom accumulator value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2854
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2855
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2856
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2857
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2858
     * var squares = _.transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], function(result, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2859
     *   num *= num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2860
     *   if (num % 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2861
     *     return result.push(num) < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2862
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2863
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2864
     * // => [1, 9, 25]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2865
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2866
     * var mapped = _.transform({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2867
     *   result[key] = num * 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2868
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2869
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2870
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2871
    function transform(object, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2872
      var isArr = isArray(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2873
      if (accumulator == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2874
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2875
          accumulator = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2876
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2877
          var ctor = object && object.constructor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2878
              proto = ctor && ctor.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2879
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2880
          accumulator = baseCreate(proto);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2881
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2882
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2883
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2884
        callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2885
        (isArr ? forEach : forOwn)(object, function(value, index, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2886
          return callback(accumulator, value, index, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2887
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2888
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2889
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2890
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2891
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2892
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2893
     * Creates an array composed of the own enumerable property values of `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2894
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2895
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2896
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2897
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2898
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2899
     * @returns {Array} Returns an array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2900
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2901
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2902
     * _.values({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2903
     * // => [1, 2, 3] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2904
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2905
    function values(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2906
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2907
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2908
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2909
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2910
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2911
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2912
        result[index] = object[props[index]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2913
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2914
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2915
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2916
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2917
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2918
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2919
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2920
     * Creates an array of elements from the specified indexes, or keys, of the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2921
     * `collection`. Indexes may be specified as individual arguments or as arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2922
     * of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2923
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2924
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2925
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2926
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2927
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2928
     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2929
     *   to retrieve, specified as individual indexes or arrays of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2930
     * @returns {Array} Returns a new array of elements corresponding to the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2931
     *  provided indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2932
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2933
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2934
     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2935
     * // => ['a', 'c', 'e']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2936
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2937
     * _.at(['fred', 'barney', 'pebbles'], 0, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2938
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2939
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2940
    function at(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2941
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2942
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2943
          props = baseFlatten(args, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2944
          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2945
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2946
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2947
      while(++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2948
        result[index] = collection[props[index]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2949
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2950
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2951
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2952
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2953
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2954
     * Checks if a given value is present in a collection using strict equality
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2955
     * for comparisons, i.e. `===`. If `fromIndex` is negative, it is used as the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2956
     * offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2957
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2958
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2959
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2960
     * @alias include
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2961
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2962
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2963
     * @param {*} target The value to check for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2964
     * @param {number} [fromIndex=0] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2965
     * @returns {boolean} Returns `true` if the `target` element is found, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2966
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2967
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2968
     * _.contains([1, 2, 3], 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2969
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2970
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2971
     * _.contains([1, 2, 3], 1, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2972
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2973
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2974
     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2975
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2976
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2977
     * _.contains('pebbles', 'eb');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2978
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2979
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2980
    function contains(collection, target, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2981
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2982
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2983
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2984
          result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2985
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2986
      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2987
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2988
        result = indexOf(collection, target, fromIndex) > -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2989
      } else if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2990
        result = (isString(collection) ? collection.indexOf(target, fromIndex) : indexOf(collection, target, fromIndex)) > -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2991
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2992
        forOwn(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2993
          if (++index >= fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2994
            return !(result = value === target);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2995
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2996
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2997
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2998
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2999
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3001
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3002
     * Creates an object composed of keys generated from the results of running
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3003
     * each element of `collection` through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3004
     * of each key is the number of times the key was returned by the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3005
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3006
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3007
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3008
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3009
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3010
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3011
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3012
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3013
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3014
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3015
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3016
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3017
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3018
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3019
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3020
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3021
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3022
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3023
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3024
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3025
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3026
     * _.countBy([4.3, 6.1, 6.4], function(num) { return Math.floor(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3027
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3028
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3029
     * _.countBy([4.3, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3030
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3031
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3032
     * _.countBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3033
     * // => { '3': 2, '5': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3034
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3035
    var countBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3036
      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3037
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3038
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3039
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3040
     * Checks if the given callback returns truey value for **all** elements of
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3041
     * a collection. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3042
     * arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3043
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3044
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3045
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3046
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3047
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3048
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3049
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3050
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3051
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3052
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3053
     * @alias all
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3054
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3055
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3056
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3057
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3058
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3059
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3060
     * @returns {boolean} Returns `true` if all elements passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3061
     *  else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3062
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3063
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3064
     * _.every([true, 1, null, 'yes']);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3065
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3066
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3067
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3068
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3069
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3070
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3071
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3072
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3073
     * _.every(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3074
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3075
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3076
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3077
     * _.every(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3078
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3079
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3080
    function every(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3081
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3082
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3083
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3084
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3085
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3086
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3087
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3088
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3089
          if (!(result = !!callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3090
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3091
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3092
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3093
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3094
        forOwn(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3095
          return (result = !!callback(value, index, collection));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3096
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3097
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3098
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3099
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3100
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3101
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3102
     * Iterates over elements of a collection, returning an array of all elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3103
     * the callback returns truey for. The callback is bound to `thisArg` and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3104
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3105
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3106
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3107
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3108
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3109
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3110
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3111
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3112
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3113
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3114
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3115
     * @alias select
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3116
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3117
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3118
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3119
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3120
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3121
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3122
     * @returns {Array} Returns a new array of elements that passed the callback check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3123
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3124
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3125
     * var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3126
     * // => [2, 4, 6]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3127
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3128
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3129
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3130
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3131
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3132
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3133
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3134
     * _.filter(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3135
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3136
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3137
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3138
     * _.filter(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3139
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3140
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3141
    function filter(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3142
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3143
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3144
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3145
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3146
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3147
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3148
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3149
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3150
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3151
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3152
            result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3153
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3154
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3155
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3156
        forOwn(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3157
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3158
            result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3159
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3160
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3161
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3162
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3163
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3164
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3165
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3166
     * Iterates over elements of a collection, returning the first element that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3167
     * the callback returns truey for. The callback is bound to `thisArg` and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3168
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3169
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3170
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3171
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3172
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3173
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3174
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3175
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3176
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3177
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3178
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3179
     * @alias detect, findWhere
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3180
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3181
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3182
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3183
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3184
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3185
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3186
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3187
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3188
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3189
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3190
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3191
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3192
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3193
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3194
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3195
     * _.find(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3196
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3197
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3198
     * // => { 'name': 'barney', 'age': 36, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3199
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3200
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3201
     * _.find(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3202
     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3203
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3204
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3205
     * _.find(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3206
     * // => { 'name': 'fred', 'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3207
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3208
    function find(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3209
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3210
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3211
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3212
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3213
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3214
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3215
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3216
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3217
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3218
            return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3219
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3220
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3221
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3222
        var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3223
        forOwn(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3224
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3225
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3226
            return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3227
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3228
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3229
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3230
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3231
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3232
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3233
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3234
     * This method is like `_.find` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3235
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3236
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3237
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3238
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3239
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3240
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3241
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3242
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3243
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3244
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3245
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3246
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3247
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3248
     * _.findLast([1, 2, 3, 4], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3249
     *   return num % 2 == 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3250
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3251
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3252
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3253
    function findLast(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3254
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3255
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3256
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3257
        if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3258
          result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3259
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3260
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3261
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3262
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3263
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3265
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3266
     * Iterates over elements of a collection, executing the callback for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3267
     * element. The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3268
     * (value, index|key, collection). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3269
     * explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3270
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3271
     * Note: As with other "Collections" methods, objects with a `length` property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3272
     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3273
     * may be used for object iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3274
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3275
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3276
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3277
     * @alias each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3278
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3279
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3280
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3281
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3282
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3283
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3284
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3285
     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3286
     * // => logs each number and returns '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3287
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3288
     * _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3289
     * // => logs each number and returns the object (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3290
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3291
    function forEach(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3292
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3293
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3295
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3296
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3297
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3298
          if (callback(collection[index], index, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3299
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3300
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3301
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3302
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3303
        forOwn(collection, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3304
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3305
      return collection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3306
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3308
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3309
     * This method is like `_.forEach` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3310
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3311
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3312
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3313
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3314
     * @alias eachRight
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3315
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3316
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3317
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3318
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3319
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3320
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3321
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3322
     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3323
     * // => logs each number from right to left and returns '3,2,1'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3324
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3325
    function forEachRight(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3326
      var length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3327
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3328
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3329
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3330
          if (callback(collection[length], length, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3331
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3332
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3333
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3334
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3335
        var props = keys(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3336
        length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3337
        forOwn(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3338
          key = props ? props[--length] : --length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3339
          return callback(collection[key], key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3340
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3341
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3342
      return collection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3343
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3344
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3345
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3346
     * Creates an object composed of keys generated from the results of running
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3347
     * each element of a collection through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3348
     * of each key is an array of the elements responsible for generating the key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3349
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3350
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3351
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3352
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3353
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3354
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3355
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3356
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3357
     * else `false`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3358
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3359
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3360
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3361
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3362
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3363
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3364
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3365
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3366
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3367
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3368
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3369
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3370
     * _.groupBy([4.2, 6.1, 6.4], function(num) { return Math.floor(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3371
     * // => { '4': [4.2], '6': [6.1, 6.4] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3372
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3373
     * _.groupBy([4.2, 6.1, 6.4], function(num) { return this.floor(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3374
     * // => { '4': [4.2], '6': [6.1, 6.4] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3375
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3376
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3377
     * _.groupBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3378
     * // => { '3': ['one', 'two'], '5': ['three'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3379
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3380
    var groupBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3381
      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3382
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3383
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3384
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3385
     * Creates an object composed of keys generated from the results of running
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3386
     * each element of the collection through the given callback. The corresponding
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3387
     * value of each key is the last element responsible for generating the key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3388
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3389
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3390
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3391
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3392
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3393
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3394
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3395
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3396
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3397
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3398
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3399
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3400
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3401
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3402
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3403
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3404
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3405
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3406
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3407
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3408
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3409
     * var keys = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3410
     *   { 'dir': 'left', 'code': 97 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3411
     *   { 'dir': 'right', 'code': 100 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3412
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3413
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3414
     * _.indexBy(keys, 'dir');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3415
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3416
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3417
     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3418
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3419
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3420
     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3421
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3422
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3423
    var indexBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3424
      result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3425
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3426
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3427
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3428
     * Invokes the method named by `methodName` on each element in the `collection`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3429
     * returning an array of the results of each invoked method. Additional arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3430
     * will be provided to each invoked method. If `methodName` is a function it
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3431
     * will be invoked for, and `this` bound to, each element in the `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3432
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3433
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3434
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3435
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3436
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3437
     * @param {Function|string} methodName The name of the method to invoke or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3438
     *  the function invoked per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3439
     * @param {...*} [arg] Arguments to invoke the method with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3440
     * @returns {Array} Returns a new array of the results of each invoked method.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3441
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3442
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3443
     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3444
     * // => [[1, 5, 7], [1, 2, 3]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3445
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3446
     * _.invoke([123, 456], String.prototype.split, '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3447
     * // => [['1', '2', '3'], ['4', '5', '6']]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3448
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3449
    function invoke(collection, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3450
      var args = slice(arguments, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3451
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3452
          isFunc = typeof methodName == 'function',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3453
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3454
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3455
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3456
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3457
        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3458
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3459
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3460
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3461
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3462
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3463
     * Creates an array of values by running each element in the collection
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3464
     * through the callback. The callback is bound to `thisArg` and invoked with
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3465
     * three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3466
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3467
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3468
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3469
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3470
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3471
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3472
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3473
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3474
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3475
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3476
     * @alias collect
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3477
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3478
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3479
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3480
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3481
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3482
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3483
     * @returns {Array} Returns a new array of the results of each `callback` execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3484
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3485
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3486
     * _.map([1, 2, 3], function(num) { return num * 3; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3487
     * // => [3, 6, 9]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3488
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3489
     * _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3490
     * // => [3, 6, 9] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3491
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3492
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3493
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3494
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3495
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3496
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3497
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3498
     * _.map(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3499
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3500
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3501
    function map(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3502
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3503
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3504
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3505
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3506
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3507
        var result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3508
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3509
          result[index] = callback(collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3510
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3511
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3512
        result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3513
        forOwn(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3514
          result[++index] = callback(value, key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3515
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3516
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3517
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3518
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3519
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3520
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3521
     * Retrieves the maximum value of a collection. If the collection is empty or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3522
     * falsey `-Infinity` is returned. If a callback is provided it will be executed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3523
     * for each value in the collection to generate the criterion by which the value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3524
     * is ranked. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3525
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3526
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3527
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3528
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3529
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3530
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3531
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3532
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3533
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3534
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3535
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3536
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3537
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3538
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3539
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3540
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3541
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3542
     * @returns {*} Returns the maximum value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3543
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3544
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3545
     * _.max([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3546
     * // => 8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3547
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3548
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3549
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3550
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3551
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3552
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3553
     * _.max(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3554
     * // => { 'name': 'fred', 'age': 40 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3555
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3556
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3557
     * _.max(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3558
     * // => { 'name': 'fred', 'age': 40 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3559
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3560
    function max(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3561
      var computed = -Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3562
          result = computed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3563
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3564
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3565
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3566
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3567
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3568
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3569
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3570
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3571
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3572
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3573
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3574
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3575
          if (value > result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3576
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3577
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3578
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3579
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3580
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3581
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3582
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3583
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3584
        forEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3585
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3586
          if (current > computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3587
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3588
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3589
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3590
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3591
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3592
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3593
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3594
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3595
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3596
     * Retrieves the minimum value of a collection. If the collection is empty or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3597
     * falsey `Infinity` is returned. If a callback is provided it will be executed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3598
     * for each value in the collection to generate the criterion by which the value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3599
     * is ranked. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3600
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3601
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3602
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3603
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3604
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3605
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3606
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3607
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3608
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3609
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3610
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3611
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3612
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3613
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3614
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3615
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3616
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3617
     * @returns {*} Returns the minimum value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3618
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3619
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3620
     * _.min([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3621
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3622
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3623
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3624
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3625
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3626
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3627
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3628
     * _.min(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3629
     * // => { 'name': 'barney', 'age': 36 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3630
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3631
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3632
     * _.min(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3633
     * // => { 'name': 'barney', 'age': 36 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3634
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3635
    function min(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3636
      var computed = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3637
          result = computed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3638
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3639
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3640
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3641
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3642
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3643
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3644
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3645
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3646
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3647
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3648
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3649
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3650
          if (value < result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3651
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3652
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3653
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3654
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3655
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3656
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3657
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3658
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3659
        forEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3660
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3661
          if (current < computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3662
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3663
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3664
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3665
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3666
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3667
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3668
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3670
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3671
     * Retrieves the value of a specified property from all elements in the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3672
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3673
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3674
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3675
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3676
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3677
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3678
     * @param {string} property The name of the property to pluck.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3679
     * @returns {Array} Returns a new array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3680
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3681
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3682
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3683
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3684
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3685
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3686
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3687
     * _.pluck(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3688
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3689
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3690
    var pluck = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3691
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3692
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3693
     * Reduces a collection to a value which is the accumulated result of running
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3694
     * each element in the collection through the callback, where each successive
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3695
     * callback execution consumes the return value of the previous execution. If
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3696
     * `accumulator` is not provided the first element of the collection will be
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3697
     * used as the initial `accumulator` value. The callback is bound to `thisArg`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3698
     * and invoked with four arguments; (accumulator, value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3699
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3700
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3701
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3702
     * @alias foldl, inject
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3703
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3704
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3705
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3706
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3707
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3708
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3709
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3710
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3711
     * var sum = _.reduce([1, 2, 3], function(sum, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3712
     *   return sum + num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3713
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3714
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3715
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3716
     * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3717
     *   result[key] = num * 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3718
     *   return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3719
     * }, {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3720
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3721
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3722
    function reduce(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3723
      if (!collection) return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3724
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3725
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3726
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3727
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3728
          length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3729
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3730
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3731
        if (noaccum) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3732
          accumulator = collection[++index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3733
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3734
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3735
          accumulator = callback(accumulator, collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3736
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3737
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3738
        forOwn(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3739
          accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3740
            ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3741
            : callback(accumulator, value, index, collection)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3742
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3743
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3744
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3745
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3746
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3747
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3748
     * This method is like `_.reduce` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3749
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3750
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3751
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3752
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3753
     * @alias foldr
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3754
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3755
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3756
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3757
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3758
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3759
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3760
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3761
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3762
     * var list = [[0, 1], [2, 3], [4, 5]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3763
     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3764
     * // => [4, 5, 2, 3, 0, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3765
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3766
    function reduceRight(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3767
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3768
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3769
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3770
        accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3771
          ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3772
          : callback(accumulator, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3773
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3774
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3775
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3776
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3777
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3778
     * The opposite of `_.filter` this method returns the elements of a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3779
     * collection that the callback does **not** return truey for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3780
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3781
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3782
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3783
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3784
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3785
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3786
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3787
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3788
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3789
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3790
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3791
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3792
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3793
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3794
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3795
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3796
     * @returns {Array} Returns a new array of elements that failed the callback check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3797
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3798
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3799
     * var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3800
     * // => [1, 3, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3801
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3802
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3803
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3804
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3805
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3806
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3807
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3808
     * _.reject(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3809
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3810
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3811
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3812
     * _.reject(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3813
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3814
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3815
    function reject(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3816
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3817
      return filter(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3818
        return !callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3819
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3820
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3821
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3822
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3823
     * Retrieves a random element or `n` random elements from a collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3824
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3825
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3826
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3827
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3828
     * @param {Array|Object|string} collection The collection to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3829
     * @param {number} [n] The number of elements to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3830
     * @param- {Object} [guard] Allows working with functions like `_.map`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3831
     *  without using their `index` arguments as `n`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3832
     * @returns {Array} Returns the random sample(s) of `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3833
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3834
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3835
     * _.sample([1, 2, 3, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3836
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3837
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3838
     * _.sample([1, 2, 3, 4], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3839
     * // => [3, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3840
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3841
    function sample(collection, n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3842
      if (collection && typeof collection.length != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3843
        collection = values(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3844
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3845
      if (n == null || guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3846
        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3847
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3848
      var result = shuffle(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3849
      result.length = nativeMin(nativeMax(0, n), result.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3850
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3851
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3852
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3853
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3854
     * Creates an array of shuffled values, using a version of the Fisher-Yates
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3855
     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3856
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3857
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3858
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3859
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3860
     * @param {Array|Object|string} collection The collection to shuffle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3861
     * @returns {Array} Returns a new shuffled collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3862
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3863
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3864
     * _.shuffle([1, 2, 3, 4, 5, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3865
     * // => [4, 1, 6, 3, 5, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3866
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3867
    function shuffle(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3868
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3869
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3870
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3871
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3872
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3873
        var rand = baseRandom(0, ++index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3874
        result[index] = result[rand];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3875
        result[rand] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3876
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3877
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3878
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3879
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3880
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3881
     * Gets the size of the `collection` by returning `collection.length` for arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3882
     * and array-like objects or the number of own enumerable properties for objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3883
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3884
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3885
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3886
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3887
     * @param {Array|Object|string} collection The collection to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3888
     * @returns {number} Returns `collection.length` or number of own enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3889
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3890
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3891
     * _.size([1, 2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3892
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3893
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3894
     * _.size({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3895
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3896
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3897
     * _.size('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3898
     * // => 7
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3899
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3900
    function size(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3901
      var length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3902
      return typeof length == 'number' ? length : keys(collection).length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3903
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3904
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3905
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3906
     * Checks if the callback returns a truey value for **any** element of a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3907
     * collection. The function returns as soon as it finds a passing value and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3908
     * does not iterate over the entire collection. The callback is bound to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3909
     * `thisArg` and invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3910
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3911
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3912
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3913
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3914
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3915
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3916
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3917
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3918
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3919
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3920
     * @alias any
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3921
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3922
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3923
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3924
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3925
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3926
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3927
     * @returns {boolean} Returns `true` if any element passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3928
     *  else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3929
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3930
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3931
     * _.some([null, 0, 'yes', false], Boolean);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3932
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3933
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3934
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3935
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3936
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3937
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3938
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3939
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3940
     * _.some(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3941
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3942
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3943
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3944
     * _.some(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3945
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3946
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3947
    function some(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3948
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3949
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3950
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3951
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3952
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3953
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3954
      if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3955
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3956
          if ((result = callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3957
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3958
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3959
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3960
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3961
        forOwn(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3962
          return !(result = callback(value, index, collection));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3963
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3964
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3965
      return !!result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3966
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3967
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3968
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3969
     * Creates an array of elements, sorted in ascending order by the results of
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3970
     * running each element in a collection through the callback. This method
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3971
     * performs a stable sort, that is, it will preserve the original sort order
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3972
     * of equal elements. The callback is bound to `thisArg` and invoked with
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3973
     * three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3974
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3975
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3976
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3977
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3978
     * If an array of property names is provided for `callback` the collection
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3979
     * will be sorted by each property value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3980
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3981
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3982
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3983
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3984
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3985
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3986
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3987
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3988
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3989
     * @param {Array|Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3990
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3991
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3992
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3993
     * @returns {Array} Returns a new array of sorted elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3994
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3995
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3996
     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3997
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3998
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3999
     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4000
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4001
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4002
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4003
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4004
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4005
     *   { 'name': 'barney',  'age': 26 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4006
     *   { 'name': 'fred',    'age': 30 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4007
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4008
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4009
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4010
     * _.map(_.sortBy(characters, 'age'), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4011
     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4012
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4013
     * // sorting by multiple properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4014
     * _.map(_.sortBy(characters, ['name', 'age']), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4015
     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4016
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4017
    function sortBy(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4018
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4019
          isArr = isArray(callback),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4020
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4021
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4022
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4023
      if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4024
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4025
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4026
      forEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4027
        var object = result[++index] = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4028
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4029
          object.criteria = map(callback, function(key) { return value[key]; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4030
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4031
          (object.criteria = getArray())[0] = callback(value, key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4032
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4033
        object.index = index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4034
        object.value = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4035
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4036
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4037
      length = result.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4038
      result.sort(compareAscending);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4039
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4040
        var object = result[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4041
        result[length] = object.value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4042
        if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4043
          releaseArray(object.criteria);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4044
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4045
        releaseObject(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4046
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4047
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4048
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4049
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4050
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4051
     * Converts the `collection` to an array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4052
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4053
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4054
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4055
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4056
     * @param {Array|Object|string} collection The collection to convert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4057
     * @returns {Array} Returns the new converted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4058
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4059
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4060
     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4061
     * // => [2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4062
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4063
    function toArray(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4064
      if (collection && typeof collection.length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4065
        return slice(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4066
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4067
      return values(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4068
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4069
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4070
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4071
     * Performs a deep comparison of each element in a `collection` to the given
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4072
     * `properties` object, returning an array of all elements that have equivalent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4073
     * property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4074
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4075
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4076
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4077
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4078
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4079
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4080
     * @param {Object} props The object of property values to filter by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4081
     * @returns {Array} Returns a new array of elements that have the given properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4082
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4083
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4084
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4085
     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4086
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4087
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4088
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4089
     * _.where(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4090
     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4091
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4092
     * _.where(characters, { 'pets': ['dino'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4093
     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4094
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4095
    var where = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4096
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4097
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4098
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4099
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4100
     * Creates an array with all falsey values removed. The values `false`, `null`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4101
     * `0`, `""`, `undefined`, and `NaN` are all falsey.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4102
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4103
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4104
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4105
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4106
     * @param {Array} array The array to compact.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4107
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4108
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4109
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4110
     * _.compact([0, 1, false, 2, '', 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4111
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4112
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4113
    function compact(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4114
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4115
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4116
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4117
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4118
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4119
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4120
        if (value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4121
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4122
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4123
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4124
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4125
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4126
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4127
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4128
     * Creates an array excluding all values of the provided arrays using strict
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4129
     * equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4130
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4131
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4132
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4133
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4134
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4135
     * @param {...Array} [values] The arrays of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4136
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4137
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4138
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4139
     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4140
     * // => [1, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4141
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4142
    function difference(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4143
      return baseDifference(array, baseFlatten(arguments, true, true, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4144
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4145
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4146
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4147
     * This method is like `_.find` except that it returns the index of the first
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4148
     * element that passes the callback check, instead of the element itself.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4149
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4150
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4151
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4152
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4153
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4154
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4155
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4156
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4157
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4158
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4159
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4160
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4161
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4162
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4163
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4164
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4165
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4166
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4167
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4168
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4169
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4170
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4171
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4172
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4173
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4174
     * _.findIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4175
     *   return chr.age < 20;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4176
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4177
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4178
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4179
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4180
     * _.findIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4181
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4182
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4183
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4184
     * _.findIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4185
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4186
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4187
    function findIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4188
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4189
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4190
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4191
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4192
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4193
        if (callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4194
          return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4195
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4196
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4197
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4198
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4199
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4200
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4201
     * This method is like `_.findIndex` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4202
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4203
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4204
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4205
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4206
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4207
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4208
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4209
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4210
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4211
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4212
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4213
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4214
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4215
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4216
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4217
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4218
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4219
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4220
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4221
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4222
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4223
     *   { 'name': 'barney',  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4224
     *   { 'name': 'fred',    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4225
     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4226
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4227
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4228
     * _.findLastIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4229
     *   return chr.age > 30;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4230
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4231
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4232
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4233
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4234
     * _.findLastIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4235
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4236
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4237
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4238
     * _.findLastIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4239
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4240
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4241
    function findLastIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4242
      var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4243
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4244
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4245
        if (callback(array[length], length, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4246
          return length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4247
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4248
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4249
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4250
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4251
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4252
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4253
     * Gets the first element or first `n` elements of an array. If a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4254
     * is provided elements at the beginning of the array are returned as long
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4255
     * as the callback returns truey. The callback is bound to `thisArg` and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4256
     * invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4257
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4258
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4259
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4260
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4261
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4262
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4263
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4264
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4265
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4266
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4267
     * @alias head, take
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4268
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4269
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4270
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4271
     *  per element or the number of elements to return. If a property name or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4272
     *  object is provided it will be used to create a "_.pluck" or "_.where"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4273
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4274
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4275
     * @returns {*} Returns the first element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4276
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4277
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4278
     * _.first([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4279
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4280
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4281
     * _.first([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4282
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4283
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4284
     * _.first([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4285
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4286
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4287
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4288
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4289
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4290
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4291
     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4292
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4293
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4294
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4295
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4296
     * _.first(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4297
     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4298
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4299
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4300
     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4301
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4302
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4303
    function first(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4304
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4305
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4306
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4307
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4308
        var index = -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4309
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4310
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4311
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4312
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4313
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4314
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4315
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4316
          return array ? array[0] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4317
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4318
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4319
      return slice(array, 0, nativeMin(nativeMax(0, n), length));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4320
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4321
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4322
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4323
     * Flattens a nested array (the nesting can be to any depth). If `isShallow`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4324
     * is truey, the array will only be flattened a single level. If a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4325
     * is provided each element of the array is passed through the callback before
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4326
     * flattening. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4327
     * arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4328
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4329
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4330
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4331
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4332
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4333
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4334
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4335
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4336
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4337
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4338
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4339
     * @param {Array} array The array to flatten.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4340
     * @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4341
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4342
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4343
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4344
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4345
     * @returns {Array} Returns a new flattened array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4346
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4347
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4348
     * _.flatten([1, [2], [3, [[4]]]]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4349
     * // => [1, 2, 3, 4];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4350
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4351
     * _.flatten([1, [2], [3, [[4]]]], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4352
     * // => [1, 2, 3, [[4]]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4353
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4354
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4355
     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4356
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4357
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4358
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4359
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4360
     * _.flatten(characters, 'pets');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4361
     * // => ['hoppy', 'baby puss', 'dino']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4362
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4363
    function flatten(array, isShallow, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4364
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4365
      if (typeof isShallow != 'boolean' && isShallow != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4366
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4367
        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4368
        isShallow = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4369
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4370
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4371
        array = map(array, callback, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4372
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4373
      return baseFlatten(array, isShallow);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4374
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4375
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4376
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4377
     * Gets the index at which the first occurrence of `value` is found using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4378
     * strict equality for comparisons, i.e. `===`. If the array is already sorted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4379
     * providing `true` for `fromIndex` will run a faster binary search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4380
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4381
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4382
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4383
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4384
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4385
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4386
     * @param {boolean|number} [fromIndex=0] The index to search from or `true`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4387
     *  to perform a binary search on a sorted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4388
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4389
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4390
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4391
     * _.indexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4392
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4393
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4394
     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4395
     * // => 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4396
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4397
     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4398
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4399
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4400
    function indexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4401
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4402
        var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4403
        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4404
      } else if (fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4405
        var index = sortedIndex(array, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4406
        return array[index] === value ? index : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4407
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4408
      return baseIndexOf(array, value, fromIndex);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4409
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4410
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4411
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4412
     * Gets all but the last element or last `n` elements of an array. If a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4413
     * callback is provided elements at the end of the array are excluded from
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4414
     * the result as long as the callback returns truey. The callback is bound
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4415
     * to `thisArg` and invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4416
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4417
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4418
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4419
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4420
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4421
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4422
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4423
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4424
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4425
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4426
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4427
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4428
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4429
     *  per element or the number of elements to exclude. If a property name or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4430
     *  object is provided it will be used to create a "_.pluck" or "_.where"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4431
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4432
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4433
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4434
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4435
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4436
     * _.initial([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4437
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4438
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4439
     * _.initial([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4440
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4441
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4442
     * _.initial([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4443
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4444
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4445
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4446
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4447
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4448
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4449
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4450
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4451
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4452
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4453
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4454
     * _.initial(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4455
     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4456
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4457
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4458
     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4459
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4460
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4461
    function initial(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4462
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4463
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4464
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4465
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4466
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4467
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4468
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4469
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4470
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4471
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4472
        n = (callback == null || thisArg) ? 1 : callback || n;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4473
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4474
      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4475
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4476
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4477
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4478
     * Creates an array of unique values present in all provided arrays using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4479
     * strict equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4480
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4481
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4482
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4483
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4484
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4485
     * @returns {Array} Returns an array of shared values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4486
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4487
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4488
     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4489
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4490
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4491
    function intersection() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4492
      var args = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4493
          argsIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4494
          argsLength = arguments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4495
          caches = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4496
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4497
          trustIndexOf = indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4498
          seen = getArray();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4499
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4500
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4501
        var value = arguments[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4502
        if (isArray(value) || isArguments(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4503
          args.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4504
          caches.push(trustIndexOf && value.length >= largeArraySize &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4505
            createCache(argsIndex ? args[argsIndex] : seen));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4506
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4507
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4508
      var array = args[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4509
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4510
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4511
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4512
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4513
      outer:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4514
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4515
        var cache = caches[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4516
        value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4517
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4518
        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4519
          argsIndex = argsLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4520
          (cache || seen).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4521
          while (--argsIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4522
            cache = caches[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4523
            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4524
              continue outer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4525
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4526
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4527
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4528
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4529
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4530
      while (argsLength--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4531
        cache = caches[argsLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4532
        if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4533
          releaseObject(cache);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4534
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4535
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4536
      releaseArray(caches);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4537
      releaseArray(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4538
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4539
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4540
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4541
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4542
     * Gets the last element or last `n` elements of an array. If a callback is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4543
     * provided elements at the end of the array are returned as long as the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4544
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4545
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4546
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4547
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4548
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4549
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4550
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4551
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4552
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4553
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4554
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4555
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4556
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4557
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4558
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4559
     *  per element or the number of elements to return. If a property name or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4560
     *  object is provided it will be used to create a "_.pluck" or "_.where"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4561
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4562
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4563
     * @returns {*} Returns the last element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4564
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4565
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4566
     * _.last([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4567
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4568
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4569
     * _.last([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4570
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4571
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4572
     * _.last([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4573
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4574
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4575
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4576
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4577
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4578
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4579
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4580
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4581
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4582
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4583
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4584
     * _.pluck(_.last(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4585
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4586
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4587
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4588
     * _.last(characters, { 'employer': 'na' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4589
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4590
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4591
    function last(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4592
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4593
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4594
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4595
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4596
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4597
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4598
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4599
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4600
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4601
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4602
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4603
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4604
          return array ? array[length - 1] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4605
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4606
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4607
      return slice(array, nativeMax(0, length - n));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4608
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4609
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4610
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4611
     * Gets the index at which the last occurrence of `value` is found using strict
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4612
     * equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4613
     * as the offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4614
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4615
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4616
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4617
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4618
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4619
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4620
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4621
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4622
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4623
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4624
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4625
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4626
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4627
     * @param {number} [fromIndex=array.length-1] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4628
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4629
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4630
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4631
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4632
     * // => 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4633
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4634
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4635
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4636
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4637
    function lastIndexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4638
      var index = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4639
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4640
        index = (fromIndex < 0 ? nativeMax(0, index + fromIndex) : nativeMin(fromIndex, index - 1)) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4641
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4642
      while (index--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4643
        if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4644
          return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4645
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4646
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4647
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4648
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4649
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4650
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4651
     * Removes all provided values from the given array using strict equality for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4652
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4653
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4654
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4655
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4656
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4657
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4658
     * @param {...*} [value] The values to remove.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4659
     * @returns {Array} Returns `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4660
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4661
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4662
     * var array = [1, 2, 3, 1, 2, 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4663
     * _.pull(array, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4664
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4665
     * // => [1, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4666
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4667
    function pull(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4668
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4669
          argsIndex = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4670
          argsLength = args.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4671
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4672
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4673
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4674
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4675
            value = args[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4676
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4677
          if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4678
            splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4679
            length--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4680
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4681
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4682
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4683
      return array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4684
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4685
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4686
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4687
     * Creates an array of numbers (positive and/or negative) progressing from
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4688
     * `start` up to but not including `end`. If `start` is less than `stop` a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4689
     * zero-length range is created unless a negative `step` is specified.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4690
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4691
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4692
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4693
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4694
     * @param {number} [start=0] The start of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4695
     * @param {number} end The end of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4696
     * @param {number} [step=1] The value to increment or decrement by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4697
     * @returns {Array} Returns a new range array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4698
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4699
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4700
     * _.range(4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4701
     * // => [0, 1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4702
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4703
     * _.range(1, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4704
     * // => [1, 2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4705
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4706
     * _.range(0, 20, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4707
     * // => [0, 5, 10, 15]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4708
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4709
     * _.range(0, -4, -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4710
     * // => [0, -1, -2, -3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4711
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4712
     * _.range(1, 4, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4713
     * // => [1, 1, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4714
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4715
     * _.range(0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4716
     * // => []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4717
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4718
    function range(start, end, step) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4719
      start = +start || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4720
      step = typeof step == 'number' ? step : (+step || 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4721
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4722
      if (end == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4723
        end = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4724
        start = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4725
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4726
      // use `Array(length)` so engines like Chakra and V8 avoid slower modes
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4727
      // http://youtu.be/XAqIpGU8ZZk#t=17m25s
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4728
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4729
          length = nativeMax(0, ceil((end - start) / (step || 1))),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4730
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4731
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4732
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4733
        result[index] = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4734
        start += step;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4735
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4736
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4737
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4738
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4739
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4740
     * Removes all elements from an array that the callback returns truey for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4741
     * and returns an array of removed elements. The callback is bound to `thisArg`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4742
     * and invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4743
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4744
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4745
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4746
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4747
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4748
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4749
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4750
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4751
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4752
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4753
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4754
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4755
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4756
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4757
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4758
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4759
     * @returns {Array} Returns a new array of removed elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4760
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4761
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4762
     * var array = [1, 2, 3, 4, 5, 6];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4763
     * var evens = _.remove(array, function(num) { return num % 2 == 0; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4764
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4765
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4766
     * // => [1, 3, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4767
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4768
     * console.log(evens);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4769
     * // => [2, 4, 6]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4770
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4771
    function remove(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4772
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4773
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4774
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4775
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4776
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4777
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4778
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4779
        if (callback(value, index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4780
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4781
          splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4782
          length--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4783
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4784
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4785
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4786
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4787
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4788
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4789
     * The opposite of `_.initial` this method gets all but the first element or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4790
     * first `n` elements of an array. If a callback function is provided elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4791
     * at the beginning of the array are excluded from the result as long as the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4792
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4793
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4794
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4795
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4796
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4797
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4798
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4799
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4800
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4801
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4802
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4803
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4804
     * @alias drop, tail
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4805
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4806
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4807
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4808
     *  per element or the number of elements to exclude. If a property name or
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4809
     *  object is provided it will be used to create a "_.pluck" or "_.where"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4810
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4811
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4812
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4813
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4814
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4815
     * _.rest([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4816
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4817
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4818
     * _.rest([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4819
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4820
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4821
     * _.rest([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4822
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4823
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4824
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4825
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4826
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4827
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4828
     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4829
     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4830
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4831
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4832
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4833
     * _.pluck(_.rest(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4834
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4835
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4836
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4837
     * _.rest(characters, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4838
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4839
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4840
    function rest(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4841
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4842
        var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4843
            index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4844
            length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4845
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4846
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4847
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4848
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4849
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4850
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4851
        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4852
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4853
      return slice(array, n);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4854
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4855
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4856
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4857
     * Uses a binary search to determine the smallest index at which a value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4858
     * should be inserted into a given sorted array in order to maintain the sort
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4859
     * order of the array. If a callback is provided it will be executed for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4860
     * `value` and each element of `array` to compute their sort ranking. The
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4861
     * callback is bound to `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4862
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4863
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4864
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4865
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4866
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4867
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4868
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4869
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4870
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4871
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4872
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4873
     * @param {Array} array The array to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4874
     * @param {*} value The value to evaluate.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4875
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4876
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4877
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4878
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4879
     * @returns {number} Returns the index at which `value` should be inserted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4880
     *  into `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4881
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4882
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4883
     * _.sortedIndex([20, 30, 50], 40);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4884
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4885
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4886
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4887
     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4888
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4889
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4890
     * var dict = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4891
     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4892
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4893
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4894
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4895
     *   return dict.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4896
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4897
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4898
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4899
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4900
     *   return this.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4901
     * }, dict);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4902
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4903
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4904
    function sortedIndex(array, value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4905
      var low = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4906
          high = array ? array.length : low;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4907
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4908
      // explicitly reference `identity` for better inlining in Firefox
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4909
      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4910
      value = callback(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4911
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4912
      while (low < high) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4913
        var mid = (low + high) >>> 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4914
        (callback(array[mid]) < value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4915
          ? low = mid + 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4916
          : high = mid;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4917
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4918
      return low;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4919
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4920
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4921
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4922
     * Creates an array of unique values, in order, of the provided arrays using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4923
     * strict equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4924
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4925
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4926
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4927
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4928
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4929
     * @returns {Array} Returns an array of combined values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4930
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4931
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4932
     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4933
     * // => [1, 2, 3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4934
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4935
    function union() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4936
      return baseUniq(baseFlatten(arguments, true, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4937
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4938
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4939
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4940
     * Creates a duplicate-value-free version of an array using strict equality
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4941
     * for comparisons, i.e. `===`. If the array is sorted, providing
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4942
     * `true` for `isSorted` will use a faster algorithm. If a callback is provided
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4943
     * each element of `array` is passed through the callback before uniqueness
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4944
     * is computed. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4945
     * arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4946
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4947
     * If a property name is provided for `callback` the created "_.pluck" style
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4948
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4949
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4950
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4951
     * will return `true` for elements that have the properties of the given object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4952
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4953
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4954
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4955
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4956
     * @alias unique
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4957
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4958
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4959
     * @param {boolean} [isSorted=false] A flag to indicate that `array` is sorted.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4960
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4961
     *  per iteration. If a property name or object is provided it will be used
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4962
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4963
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4964
     * @returns {Array} Returns a duplicate-value-free array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4965
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4966
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4967
     * _.uniq([1, 2, 1, 3, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4968
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4969
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4970
     * _.uniq([1, 1, 2, 2, 3], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4971
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4972
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4973
     * _.uniq(['A', 'b', 'C', 'a', 'B', 'c'], function(letter) { return letter.toLowerCase(); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4974
     * // => ['A', 'b', 'C']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4975
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4976
     * _.uniq([1, 2.5, 3, 1.5, 2, 3.5], function(num) { return this.floor(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4977
     * // => [1, 2.5, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4978
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4979
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4980
     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4981
     * // => [{ 'x': 1 }, { 'x': 2 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4982
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4983
    function uniq(array, isSorted, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4984
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4985
      if (typeof isSorted != 'boolean' && isSorted != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4986
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4987
        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4988
        isSorted = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4989
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4990
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4991
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4992
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4993
      return baseUniq(array, isSorted, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4994
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4995
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4996
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4997
     * Creates an array excluding all provided values using strict equality for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4998
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4999
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5000
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5001
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5002
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5003
     * @param {Array} array The array to filter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5004
     * @param {...*} [value] The values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5005
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5006
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5007
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5008
     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5009
     * // => [2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5010
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5011
    function without(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5012
      return baseDifference(array, slice(arguments, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5013
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5014
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5015
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5016
     * Creates an array that is the symmetric difference of the provided arrays.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5017
     * See http://en.wikipedia.org/wiki/Symmetric_difference.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5018
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5019
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5020
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5021
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5022
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5023
     * @returns {Array} Returns an array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5024
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5025
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5026
     * _.xor([1, 2, 3], [5, 2, 1, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5027
     * // => [3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5028
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5029
     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5030
     * // => [1, 4, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5031
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5032
    function xor() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5033
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5034
          length = arguments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5035
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5036
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5037
        var array = arguments[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5038
        if (isArray(array) || isArguments(array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5039
          var result = result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5040
            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5041
            : array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5042
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5043
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5044
      return result || [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5045
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5046
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5047
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5048
     * Creates an array of grouped elements, the first of which contains the first
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5049
     * elements of the given arrays, the second of which contains the second
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5050
     * elements of the given arrays, and so on.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5051
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5052
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5053
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5054
     * @alias unzip
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5055
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5056
     * @param {...Array} [array] Arrays to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5057
     * @returns {Array} Returns a new array of grouped elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5058
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5059
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5060
     * _.zip(['fred', 'barney'], [30, 40], [true, false]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5061
     * // => [['fred', 30, true], ['barney', 40, false]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5062
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5063
    function zip() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5064
      var array = arguments.length > 1 ? arguments : arguments[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5065
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5066
          length = array ? max(pluck(array, 'length')) : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5067
          result = Array(length < 0 ? 0 : length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5068
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5069
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5070
        result[index] = pluck(array, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5071
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5072
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5073
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5074
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5075
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5076
     * Creates an object composed from arrays of `keys` and `values`. Provide
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5077
     * either a single two dimensional array, i.e. `[[key1, value1], [key2, value2]]`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5078
     * or two arrays, one of `keys` and one of corresponding `values`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5079
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5080
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5081
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5082
     * @alias object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5083
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5084
     * @param {Array} keys The array of keys.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5085
     * @param {Array} [values=[]] The array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5086
     * @returns {Object} Returns an object composed of the given keys and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5087
     *  corresponding values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5088
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5089
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5090
     * _.zipObject(['fred', 'barney'], [30, 40]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5091
     * // => { 'fred': 30, 'barney': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5092
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5093
    function zipObject(keys, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5094
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5095
          length = keys ? keys.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5096
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5097
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5098
      if (!values && length && !isArray(keys[0])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5099
        values = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5100
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5101
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5102
        var key = keys[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5103
        if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5104
          result[key] = values[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5105
        } else if (key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5106
          result[key[0]] = key[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5107
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5108
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5109
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5110
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5111
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5112
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5113
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5114
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5115
     * Creates a function that executes `func`, with  the `this` binding and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5116
     * arguments of the created function, only after being called `n` times.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5117
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5118
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5119
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5120
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5121
     * @param {number} n The number of times the function must be called before
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5122
     *  `func` is executed.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5123
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5124
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5125
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5126
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5127
     * var saves = ['profile', 'settings'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5128
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5129
     * var done = _.after(saves.length, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5130
     *   console.log('Done saving!');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5131
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5132
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5133
     * _.forEach(saves, function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5134
     *   asyncSave({ 'type': type, 'complete': done });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5135
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5136
     * // => logs 'Done saving!', after all saves have completed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5137
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5138
    function after(n, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5139
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5140
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5141
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5142
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5143
        if (--n < 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5144
          return func.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5145
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5146
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5147
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5148
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5149
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5150
     * Creates a function that, when called, invokes `func` with the `this`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5151
     * binding of `thisArg` and prepends any additional `bind` arguments to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5152
     * provided to the bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5153
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5154
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5155
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5156
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5157
     * @param {Function} func The function to bind.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5158
     * @param {*} [thisArg] The `this` binding of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5159
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5160
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5161
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5162
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5163
     * var func = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5164
     *   return greeting + ' ' + this.name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5165
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5166
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5167
     * func = _.bind(func, { 'name': 'fred' }, 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5168
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5169
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5170
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5171
    function bind(func, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5172
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5173
        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5174
        : createWrapper(func, 1, null, null, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5175
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5176
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5177
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5178
     * Binds methods of an object to the object itself, overwriting the existing
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5179
     * method. Method names may be specified as individual arguments or as arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5180
     * of method names. If no method names are provided all the function properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5181
     * of `object` will be bound.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5182
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5183
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5184
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5185
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5186
     * @param {Object} object The object to bind and assign the bound methods to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5187
     * @param {...string} [methodName] The object method names to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5188
     *  bind, specified as individual method names or arrays of method names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5189
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5190
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5191
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5192
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5193
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5194
     *   'onClick': function() { console.log('clicked ' + this.label); }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5195
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5196
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5197
     * _.bindAll(view);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5198
     * jQuery('#docs').on('click', view.onClick);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5199
     * // => logs 'clicked docs', when the button is clicked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5200
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5201
    function bindAll(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5202
      var funcs = arguments.length > 1 ? baseFlatten(arguments, true, false, 1) : functions(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5203
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5204
          length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5205
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5206
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5207
        var key = funcs[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5208
        object[key] = createWrapper(object[key], 1, null, null, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5209
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5210
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5211
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5212
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5213
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5214
     * Creates a function that, when called, invokes the method at `object[key]`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5215
     * and prepends any additional `bindKey` arguments to those provided to the bound
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5216
     * function. This method differs from `_.bind` by allowing bound functions to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5217
     * reference methods that will be redefined or don't yet exist.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5218
     * See http://michaux.ca/articles/lazy-function-definition-pattern.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5219
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5220
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5221
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5222
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5223
     * @param {Object} object The object the method belongs to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5224
     * @param {string} key The key of the method.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5225
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5226
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5227
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5228
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5229
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5230
     *   'name': 'fred',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5231
     *   'greet': function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5232
     *     return greeting + ' ' + this.name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5233
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5234
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5235
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5236
     * var func = _.bindKey(object, 'greet', 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5237
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5238
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5239
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5240
     * object.greet = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5241
     *   return greeting + 'ya ' + this.name + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5242
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5243
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5244
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5245
     * // => 'hiya fred!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5246
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5247
    function bindKey(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5248
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5249
        ? createWrapper(key, 19, slice(arguments, 2), null, object)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5250
        : createWrapper(key, 3, null, null, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5251
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5252
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5253
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5254
     * Creates a function that is the composition of the provided functions,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5255
     * where each function consumes the return value of the function that follows.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5256
     * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5257
     * Each function is executed with the `this` binding of the composed function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5258
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5259
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5260
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5261
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5262
     * @param {...Function} [func] Functions to compose.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5263
     * @returns {Function} Returns the new composed function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5264
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5265
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5266
     * var realNameMap = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5267
     *   'pebbles': 'penelope'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5268
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5269
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5270
     * var format = function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5271
     *   name = realNameMap[name.toLowerCase()] || name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5272
     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5273
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5274
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5275
     * var greet = function(formatted) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5276
     *   return 'Hiya ' + formatted + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5277
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5278
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5279
     * var welcome = _.compose(greet, format);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5280
     * welcome('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5281
     * // => 'Hiya Penelope!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5282
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5283
    function compose() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5284
      var funcs = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5285
          length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5287
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5288
        if (!isFunction(funcs[length])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5289
          throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5290
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5291
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5292
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5293
        var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5294
            length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5295
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5296
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5297
          args = [funcs[length].apply(this, args)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5298
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5299
        return args[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5300
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5301
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5302
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5303
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5304
     * Creates a function which accepts one or more arguments of `func` that when
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5305
     * invoked either executes `func` returning its result, if all `func` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5306
     * have been provided, or returns a function that accepts one or more of the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5307
     * remaining `func` arguments, and so on. The arity of `func` can be specified
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5308
     * if `func.length` is not sufficient.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5309
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5310
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5311
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5312
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5313
     * @param {Function} func The function to curry.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5314
     * @param {number} [arity=func.length] The arity of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5315
     * @returns {Function} Returns the new curried function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5316
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5317
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5318
     * var curried = _.curry(function(a, b, c) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5319
     *   console.log(a + b + c);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5320
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5321
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5322
     * curried(1)(2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5323
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5324
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5325
     * curried(1, 2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5326
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5327
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5328
     * curried(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5329
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5330
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5331
    function curry(func, arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5332
      arity = typeof arity == 'number' ? arity : (+arity || func.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5333
      return createWrapper(func, 4, null, null, null, arity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5334
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5335
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5336
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5337
     * Creates a function that will delay the execution of `func` until after
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5338
     * `wait` milliseconds have elapsed since the last time it was invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5339
     * Provide an options object to indicate that `func` should be invoked on
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5340
     * the leading and/or trailing edge of the `wait` timeout. Subsequent calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5341
     * to the debounced function will return the result of the last `func` call.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5342
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5343
     * Note: If `leading` and `trailing` options are `true` `func` will be called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5344
     * on the trailing edge of the timeout only if the the debounced function is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5345
     * invoked more than once during the `wait` timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5346
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5347
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5348
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5349
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5350
     * @param {Function} func The function to debounce.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5351
     * @param {number} wait The number of milliseconds to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5352
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5353
     * @param {boolean} [options.leading=false] Specify execution on the leading edge of the timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5354
     * @param {number} [options.maxWait] The maximum time `func` is allowed to be delayed before it's called.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5355
     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5356
     * @returns {Function} Returns the new debounced function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5357
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5358
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5359
     * // avoid costly calculations while the window size is in flux
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5360
     * var lazyLayout = _.debounce(calculateLayout, 150);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5361
     * jQuery(window).on('resize', lazyLayout);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5362
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5363
     * // execute `sendMail` when the click event is fired, debouncing subsequent calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5364
     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5365
     *   'leading': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5366
     *   'trailing': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5367
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5368
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5369
     * // ensure `batchLog` is executed once after 1 second of debounced calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5370
     * var source = new EventSource('/stream');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5371
     * source.addEventListener('message', _.debounce(batchLog, 250, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5372
     *   'maxWait': 1000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5373
     * }, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5374
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5375
    function debounce(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5376
      var args,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5377
          maxTimeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5378
          result,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5379
          stamp,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5380
          thisArg,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5381
          timeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5382
          trailingCall,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5383
          lastCalled = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5384
          maxWait = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5385
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5386
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5387
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5388
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5389
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5390
      wait = nativeMax(0, wait) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5391
      if (options === true) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5392
        var leading = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5393
        trailing = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5394
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5395
        leading = options.leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5396
        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5397
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5398
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5399
      var delayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5400
        var remaining = wait - (now() - stamp);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5401
        if (remaining <= 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5402
          if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5403
            clearTimeout(maxTimeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5404
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5405
          var isCalled = trailingCall;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5406
          maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5407
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5408
            lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5409
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5410
            if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5411
              args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5412
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5413
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5414
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5415
          timeoutId = setTimeout(delayed, remaining);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5416
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5417
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5418
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5419
      var maxDelayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5420
        if (timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5421
          clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5422
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5423
        maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5424
        if (trailing || (maxWait !== wait)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5425
          lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5426
          result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5427
          if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5428
            args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5429
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5430
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5431
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5432
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5433
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5434
        args = arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5435
        stamp = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5436
        thisArg = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5437
        trailingCall = trailing && (timeoutId || !leading);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5438
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5439
        if (maxWait === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5440
          var leadingCall = leading && !timeoutId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5441
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5442
          if (!maxTimeoutId && !leading) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5443
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5444
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5445
          var remaining = maxWait - (stamp - lastCalled),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5446
              isCalled = remaining <= 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5447
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5448
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5449
            if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5450
              maxTimeoutId = clearTimeout(maxTimeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5451
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5452
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5453
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5454
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5455
          else if (!maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5456
            maxTimeoutId = setTimeout(maxDelayed, remaining);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5457
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5458
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5459
        if (isCalled && timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5460
          timeoutId = clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5461
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5462
        else if (!timeoutId && wait !== maxWait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5463
          timeoutId = setTimeout(delayed, wait);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5464
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5465
        if (leadingCall) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5466
          isCalled = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5467
          result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5468
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5469
        if (isCalled && !timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5470
          args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5471
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5472
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5473
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5474
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5475
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5476
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5477
     * Defers executing the `func` function until the current call stack has cleared.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5478
     * Additional arguments will be provided to `func` when it is invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5479
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5480
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5481
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5482
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5483
     * @param {Function} func The function to defer.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5484
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5485
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5486
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5487
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5488
     * _.defer(function(text) { console.log(text); }, 'deferred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5489
     * // logs 'deferred' after one or more milliseconds
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5490
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5491
    function defer(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5492
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5493
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5494
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5495
      var args = slice(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5496
      return setTimeout(function() { func.apply(undefined, args); }, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5497
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5498
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5499
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5500
     * Executes the `func` function after `wait` milliseconds. Additional arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5501
     * will be provided to `func` when it is invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5502
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5503
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5504
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5505
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5506
     * @param {Function} func The function to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5507
     * @param {number} wait The number of milliseconds to delay execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5508
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5509
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5510
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5511
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5512
     * _.delay(function(text) { console.log(text); }, 1000, 'later');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5513
     * // => logs 'later' after one second
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5514
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5515
    function delay(func, wait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5516
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5517
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5518
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5519
      var args = slice(arguments, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5520
      return setTimeout(function() { func.apply(undefined, args); }, wait);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5521
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5522
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5523
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5524
     * Creates a function that memoizes the result of `func`. If `resolver` is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5525
     * provided it will be used to determine the cache key for storing the result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5526
     * based on the arguments provided to the memoized function. By default, the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5527
     * first argument provided to the memoized function is used as the cache key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5528
     * The `func` is executed with the `this` binding of the memoized function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5529
     * The result cache is exposed as the `cache` property on the memoized function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5530
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5531
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5532
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5533
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5534
     * @param {Function} func The function to have its output memoized.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5535
     * @param {Function} [resolver] A function used to resolve the cache key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5536
     * @returns {Function} Returns the new memoizing function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5537
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5538
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5539
     * var fibonacci = _.memoize(function(n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5540
     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5541
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5542
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5543
     * fibonacci(9)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5544
     * // => 34
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5545
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5546
     * var data = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5547
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5548
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5549
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5550
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5551
     * // modifying the result cache
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5552
     * var get = _.memoize(function(name) { return data[name]; }, _.identity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5553
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5554
     * // => { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5555
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5556
     * get.cache.pebbles.name = 'penelope';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5557
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5558
     * // => { 'name': 'penelope', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5559
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5560
    function memoize(func, resolver) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5561
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5562
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5563
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5564
      var memoized = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5565
        var cache = memoized.cache,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5566
            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5567
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5568
        return hasOwnProperty.call(cache, key)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5569
          ? cache[key]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5570
          : (cache[key] = func.apply(this, arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5571
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5572
      memoized.cache = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5573
      return memoized;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5574
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5575
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5576
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5577
     * Creates a function that is restricted to execute `func` once. Repeat calls to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5578
     * the function will return the value of the first call. The `func` is executed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5579
     * with the `this` binding of the created function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5580
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5581
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5582
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5583
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5584
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5585
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5586
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5587
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5588
     * var initialize = _.once(createApplication);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5589
     * initialize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5590
     * initialize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5591
     * // `initialize` executes `createApplication` once
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5592
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5593
    function once(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5594
      var ran,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5595
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5596
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5597
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5598
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5599
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5600
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5601
        if (ran) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5602
          return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5603
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5604
        ran = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5605
        result = func.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5606
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5607
        // clear the `func` variable so the function may be garbage collected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5608
        func = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5609
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5610
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5611
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5612
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5613
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5614
     * Creates a function that, when called, invokes `func` with any additional
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5615
     * `partial` arguments prepended to those provided to the new function. This
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5616
     * method is similar to `_.bind` except it does **not** alter the `this` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5617
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5618
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5619
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5620
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5621
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5622
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5623
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5624
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5625
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5626
     * var greet = function(greeting, name) { return greeting + ' ' + name; };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5627
     * var hi = _.partial(greet, 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5628
     * hi('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5629
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5630
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5631
    function partial(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5632
      return createWrapper(func, 16, slice(arguments, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5633
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5634
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5635
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5636
     * This method is like `_.partial` except that `partial` arguments are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5637
     * appended to those provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5638
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5639
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5640
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5641
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5642
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5643
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5644
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5645
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5646
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5647
     * var defaultsDeep = _.partialRight(_.merge, _.defaults);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5648
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5649
     * var options = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5650
     *   'variable': 'data',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5651
     *   'imports': { 'jq': $ }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5652
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5653
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5654
     * defaultsDeep(options, _.templateSettings);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5655
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5656
     * options.variable
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5657
     * // => 'data'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5658
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5659
     * options.imports
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5660
     * // => { '_': _, 'jq': $ }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5661
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5662
    function partialRight(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5663
      return createWrapper(func, 32, null, slice(arguments, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5664
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5665
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5666
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5667
     * Creates a function that, when executed, will only call the `func` function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5668
     * at most once per every `wait` milliseconds. Provide an options object to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5669
     * indicate that `func` should be invoked on the leading and/or trailing edge
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5670
     * of the `wait` timeout. Subsequent calls to the throttled function will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5671
     * return the result of the last `func` call.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5672
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5673
     * Note: If `leading` and `trailing` options are `true` `func` will be called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5674
     * on the trailing edge of the timeout only if the the throttled function is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5675
     * invoked more than once during the `wait` timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5676
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5677
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5678
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5679
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5680
     * @param {Function} func The function to throttle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5681
     * @param {number} wait The number of milliseconds to throttle executions to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5682
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5683
     * @param {boolean} [options.leading=true] Specify execution on the leading edge of the timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5684
     * @param {boolean} [options.trailing=true] Specify execution on the trailing edge of the timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5685
     * @returns {Function} Returns the new throttled function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5686
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5687
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5688
     * // avoid excessively updating the position while scrolling
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5689
     * var throttled = _.throttle(updatePosition, 100);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5690
     * jQuery(window).on('scroll', throttled);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5691
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5692
     * // execute `renewToken` when the click event is fired, but not more than once every 5 minutes
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5693
     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5694
     *   'trailing': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5695
     * }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5696
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5697
    function throttle(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5698
      var leading = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5699
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5700
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5701
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5702
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5703
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5704
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5705
        leading = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5706
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5707
        leading = 'leading' in options ? options.leading : leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5708
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5709
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5710
      debounceOptions.leading = leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5711
      debounceOptions.maxWait = wait;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5712
      debounceOptions.trailing = trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5713
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5714
      return debounce(func, wait, debounceOptions);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5715
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5716
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5717
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5718
     * Creates a function that provides `value` to the wrapper function as its
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5719
     * first argument. Additional arguments provided to the function are appended
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5720
     * to those provided to the wrapper function. The wrapper is executed with
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5721
     * the `this` binding of the created function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5722
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5723
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5724
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5725
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5726
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5727
     * @param {Function} wrapper The wrapper function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5728
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5729
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5730
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5731
     * var p = _.wrap(_.escape, function(func, text) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5732
     *   return '<p>' + func(text) + '</p>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5733
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5734
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5735
     * p('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5736
     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5737
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5738
    function wrap(value, wrapper) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5739
      return createWrapper(wrapper, 16, [value]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5740
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5741
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5742
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5743
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5744
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5745
     * Creates a function that returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5746
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5747
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5748
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5749
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5750
     * @param {*} value The value to return from the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5751
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5752
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5753
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5754
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5755
     * var getter = _.constant(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5756
     * getter() === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5757
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5758
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5759
    function constant(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5760
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5761
        return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5762
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5763
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5764
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5765
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5766
     * Produces a callback bound to an optional `thisArg`. If `func` is a property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5767
     * name the created callback will return the property value for a given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5768
     * If `func` is an object the created callback will return `true` for elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5769
     * that contain the equivalent object properties, otherwise it will return `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5770
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5771
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5772
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5773
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5774
     * @param {*} [func=identity] The value to convert to a callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5775
     * @param {*} [thisArg] The `this` binding of the created callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5776
     * @param {number} [argCount] The number of arguments the callback accepts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5777
     * @returns {Function} Returns a callback function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5778
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5779
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5780
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5781
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5782
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5783
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5784
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5785
     * // wrap to create custom callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5786
     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5787
     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5788
     *   return !match ? func(callback, thisArg) : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5789
     *     return match[2] == 'gt' ? object[match[1]] > match[3] : object[match[1]] < match[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5790
     *   };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5791
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5792
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5793
     * _.filter(characters, 'age__gt38');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5794
     * // => [{ 'name': 'fred', 'age': 40 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5795
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5796
    function createCallback(func, thisArg, argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5797
      var type = typeof func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5798
      if (func == null || type == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5799
        return baseCreateCallback(func, thisArg, argCount);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5800
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5801
      // handle "_.pluck" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5802
      if (type != 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5803
        return property(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5804
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5805
      var props = keys(func),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5806
          key = props[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5807
          a = func[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5808
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5809
      // handle "_.where" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5810
      if (props.length == 1 && a === a && !isObject(a)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5811
        // fast path the common case of providing an object with a single
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5812
        // property containing a primitive value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5813
        return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5814
          var b = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5815
          return a === b && (a !== 0 || (1 / a == 1 / b));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5816
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5817
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5818
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5819
        var length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5820
            result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5821
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5822
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5823
          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5824
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5825
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5826
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5827
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5828
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5829
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5830
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5831
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5832
     * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5833
     * corresponding HTML entities.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5834
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5835
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5836
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5837
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5838
     * @param {string} string The string to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5839
     * @returns {string} Returns the escaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5840
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5841
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5842
     * _.escape('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5843
     * // => 'Fred, Wilma, &amp; Pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5844
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5845
    function escape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5846
      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5847
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5848
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5849
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5850
     * This method returns the first argument provided to it.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5851
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5852
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5853
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5854
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5855
     * @param {*} value Any value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5856
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5857
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5858
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5859
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5860
     * _.identity(object) === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5861
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5862
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5863
    function identity(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5864
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5865
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5866
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5867
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5868
     * Adds function properties of a source object to the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5869
     * If `object` is a function methods will be added to its prototype as well.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5870
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5871
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5872
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5873
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5874
     * @param {Function|Object} [object=lodash] object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5875
     * @param {Object} source The object of functions to add.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5876
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5877
     * @param {boolean} [options.chain=true] Specify whether the functions added are chainable.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5878
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5879
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5880
     * function capitalize(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5881
     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5882
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5883
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5884
     * _.mixin({ 'capitalize': capitalize });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5885
     * _.capitalize('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5886
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5887
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5888
     * _('fred').capitalize().value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5889
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5890
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5891
     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5892
     * _('fred').capitalize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5893
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5894
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5895
    function mixin(object, source, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5896
      var chain = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5897
          methodNames = source && functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5898
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5899
      if (!source || (!options && !methodNames.length)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5900
        if (options == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5901
          options = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5902
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5903
        ctor = lodashWrapper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5904
        source = object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5905
        object = lodash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5906
        methodNames = functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5907
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5908
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5909
        chain = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5910
      } else if (isObject(options) && 'chain' in options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5911
        chain = options.chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5912
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5913
      var ctor = object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5914
          isFunc = isFunction(ctor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5915
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5916
      forEach(methodNames, function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5917
        var func = object[methodName] = source[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5918
        if (isFunc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5919
          ctor.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5920
            var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5921
                value = this.__wrapped__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5922
                args = [value];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5923
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5924
            push.apply(args, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5925
            var result = func.apply(object, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5926
            if (chain || chainAll) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5927
              if (value === result && isObject(result)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5928
                return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5929
              }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5930
              result = new ctor(result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5931
              result.__chain__ = chainAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5932
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5933
            return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5934
          };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5935
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5936
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5937
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5938
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5939
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5940
     * Reverts the '_' variable to its previous value and returns a reference to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5941
     * the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5942
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5943
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5944
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5945
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5946
     * @returns {Function} Returns the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5947
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5948
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5949
     * var lodash = _.noConflict();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5950
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5951
    function noConflict() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5952
      context._ = oldDash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5953
      return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5954
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5955
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5956
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5957
     * A no-operation function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5958
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5959
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5960
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5961
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5962
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5963
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5964
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5965
     * _.noop(object) === undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5966
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5967
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5968
    function noop() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5969
      // no operation performed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5970
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5971
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5972
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5973
     * Gets the number of milliseconds that have elapsed since the Unix epoch
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5974
     * (1 January 1970 00:00:00 UTC).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5975
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5976
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5977
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5978
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5979
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5980
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5981
     * var stamp = _.now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5982
     * _.defer(function() { console.log(_.now() - stamp); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5983
     * // => logs the number of milliseconds it took for the deferred function to be called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5984
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5985
    var now = isNative(now = Date.now) && now || function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5986
      return new Date().getTime();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5987
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5988
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5989
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5990
     * Converts the given value into an integer of the specified radix.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5991
     * If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5992
     * `value` is a hexadecimal, in which case a `radix` of `16` is used.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5993
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5994
     * Note: This method avoids differences in native ES3 and ES5 `parseInt`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5995
     * implementations. See http://es5.github.io/#E.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5996
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5997
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5998
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5999
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6000
     * @param {string} value The value to parse.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6001
     * @param {number} [radix] The radix used to interpret the value to parse.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6002
     * @returns {number} Returns the new integer value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6003
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6004
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6005
     * _.parseInt('08');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6006
     * // => 8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6007
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6008
    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6009
      // Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6010
      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6011
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6012
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6013
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6014
     * Creates a "_.pluck" style function, which returns the `key` value of a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6015
     * given object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6016
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6017
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6018
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6019
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6020
     * @param {string} key The name of the property to retrieve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6021
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6022
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6023
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6024
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6025
     *   { 'name': 'fred',   'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6026
     *   { 'name': 'barney', 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6027
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6028
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6029
     * var getName = _.property('name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6030
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6031
     * _.map(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6032
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6033
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6034
     * _.sortBy(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6035
     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6036
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6037
    function property(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6038
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6039
        return object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6040
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6041
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6042
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6043
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6044
     * Produces a random number between `min` and `max` (inclusive). If only one
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6045
     * argument is provided a number between `0` and the given number will be
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6046
     * returned. If `floating` is truey or either `min` or `max` are floats a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6047
     * floating-point number will be returned instead of an integer.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6048
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6049
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6050
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6051
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6052
     * @param {number} [min=0] The minimum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6053
     * @param {number} [max=1] The maximum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6054
     * @param {boolean} [floating=false] Specify returning a floating-point number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6055
     * @returns {number} Returns a random number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6056
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6057
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6058
     * _.random(0, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6059
     * // => an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6060
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6061
     * _.random(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6062
     * // => also an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6063
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6064
     * _.random(5, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6065
     * // => a floating-point number between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6066
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6067
     * _.random(1.2, 5.2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6068
     * // => a floating-point number between 1.2 and 5.2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6069
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6070
    function random(min, max, floating) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6071
      var noMin = min == null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6072
          noMax = max == null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6073
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6074
      if (floating == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6075
        if (typeof min == 'boolean' && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6076
          floating = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6077
          min = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6078
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6079
        else if (!noMax && typeof max == 'boolean') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6080
          floating = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6081
          noMax = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6082
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6083
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6084
      if (noMin && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6085
        max = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6086
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6087
      min = +min || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6088
      if (noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6089
        max = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6090
        min = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6091
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6092
        max = +max || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6093
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6094
      if (floating || min % 1 || max % 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6095
        var rand = nativeRandom();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6096
        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6097
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6098
      return baseRandom(min, max);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6099
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6100
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6101
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6102
     * Resolves the value of property `key` on `object`. If `key` is a function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6103
     * it will be invoked with the `this` binding of `object` and its result returned,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6104
     * else the property value is returned. If `object` is falsey then `undefined`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6105
     * is returned.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6106
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6107
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6108
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6109
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6110
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6111
     * @param {string} key The name of the property to resolve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6112
     * @returns {*} Returns the resolved value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6113
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6114
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6115
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6116
     *   'cheese': 'crumpets',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6117
     *   'stuff': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6118
     *     return 'nonsense';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6119
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6120
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6121
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6122
     * _.result(object, 'cheese');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6123
     * // => 'crumpets'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6124
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6125
     * _.result(object, 'stuff');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6126
     * // => 'nonsense'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6127
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6128
    function result(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6129
      if (object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6130
        var value = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6131
        return isFunction(value) ? object[key]() : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6132
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6133
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6134
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6135
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6136
     * A micro-templating method that handles arbitrary delimiters, preserves
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6137
     * whitespace, and correctly escapes quotes within interpolated code.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6138
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6139
     * Note: In the development build, `_.template` utilizes sourceURLs for easier
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6140
     * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6141
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6142
     * For more information on precompiling templates see:
456
a3bf10beb710 copy client change to server (grunt copy-server)
rougeronj
parents: 442
diff changeset
  6143
     * https://lodash.com/custom-builds
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6144
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6145
     * For more information on Chrome extension sandboxes see:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6146
     * http://developer.chrome.com/stable/extensions/sandboxingEval.html
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6147
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6148
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6149
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6150
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6151
     * @param {string} text The template text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6152
     * @param {Object} data The data object used to populate the text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6153
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6154
     * @param {RegExp} [options.escape] The "escape" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6155
     * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6156
     * @param {Object} [options.imports] An object to import into the template as local variables.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6157
     * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6158
     * @param {string} [sourceURL] The sourceURL of the template's compiled source.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6159
     * @param {string} [variable] The data object variable name.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6160
     * @returns {Function|string} Returns a compiled function when no `data` object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6161
     *  is given, else it returns the interpolated text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6162
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6163
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6164
     * // using the "interpolate" delimiter to create a compiled template
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6165
     * var compiled = _.template('hello <%= name %>');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6166
     * compiled({ 'name': 'fred' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6167
     * // => 'hello fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6168
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6169
     * // using the "escape" delimiter to escape HTML in data property values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6170
     * _.template('<b><%- value %></b>', { 'value': '<script>' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6171
     * // => '<b>&lt;script&gt;</b>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6172
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6173
     * // using the "evaluate" delimiter to generate HTML
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6174
     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6175
     * _.template(list, { 'people': ['fred', 'barney'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6176
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6177
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6178
     * // using the ES6 delimiter as an alternative to the default "interpolate" delimiter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6179
     * _.template('hello ${ name }', { 'name': 'pebbles' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6180
     * // => 'hello pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6181
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6182
     * // using the internal `print` function in "evaluate" delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6183
     * _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6184
     * // => 'hello barney!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6185
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6186
     * // using a custom template delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6187
     * _.templateSettings = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6188
     *   'interpolate': /{{([\s\S]+?)}}/g
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6189
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6190
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6191
     * _.template('hello {{ name }}!', { 'name': 'mustache' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6192
     * // => 'hello mustache!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6193
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6194
     * // using the `imports` option to import jQuery
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6195
     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6196
     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6197
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6198
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6199
     * // using the `sourceURL` option to specify a custom sourceURL for the template
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6200
     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6201
     * compiled(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6202
     * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6203
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6204
     * // using the `variable` option to ensure a with-statement isn't used in the compiled template
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6205
     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6206
     * compiled.source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6207
     * // => function(data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6208
     *   var __t, __p = '', __e = _.escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6209
     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6210
     *   return __p;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6211
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6212
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6213
     * // using the `source` property to inline compiled templates for meaningful
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6214
     * // line numbers in error messages and a stack trace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6215
     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6216
     *   var JST = {\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6217
     *     "main": ' + _.template(mainText).source + '\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6218
     *   };\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6219
     * ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6220
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6221
    function template(text, data, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6222
      // based on John Resig's `tmpl` implementation
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6223
      // http://ejohn.org/blog/javascript-micro-templating/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6224
      // and Laura Doktorova's doT.js
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6225
      // https://github.com/olado/doT
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6226
      var settings = lodash.templateSettings;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6227
      text = String(text || '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6228
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6229
      // avoid missing dependencies when `iteratorTemplate` is not defined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6230
      options = defaults({}, options, settings);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6231
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6232
      var imports = defaults({}, options.imports, settings.imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6233
          importsKeys = keys(imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6234
          importsValues = values(imports);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6235
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6236
      var isEvaluating,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6237
          index = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6238
          interpolate = options.interpolate || reNoMatch,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6239
          source = "__p += '";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6240
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6241
      // compile the regexp to match each delimiter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6242
      var reDelimiters = RegExp(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6243
        (options.escape || reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6244
        interpolate.source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6245
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6246
        (options.evaluate || reNoMatch).source + '|$'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6247
      , 'g');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6248
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6249
      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6250
        interpolateValue || (interpolateValue = esTemplateValue);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6251
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6252
        // escape characters that cannot be included in string literals
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6253
        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6254
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6255
        // replace delimiters with snippets
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6256
        if (escapeValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6257
          source += "' +\n__e(" + escapeValue + ") +\n'";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6258
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6259
        if (evaluateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6260
          isEvaluating = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6261
          source += "';\n" + evaluateValue + ";\n__p += '";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6262
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6263
        if (interpolateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6264
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6265
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6266
        index = offset + match.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6267
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6268
        // the JS engine embedded in Adobe products requires returning the `match`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6269
        // string in order to produce the correct `offset` value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6270
        return match;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6271
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6272
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6273
      source += "';\n";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6274
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6275
      // if `variable` is not specified, wrap a with-statement around the generated
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6276
      // code to add the data object to the top of the scope chain
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6277
      var variable = options.variable,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6278
          hasVariable = variable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6279
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6280
      if (!hasVariable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6281
        variable = 'obj';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6282
        source = 'with (' + variable + ') {\n' + source + '\n}\n';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6283
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6284
      // cleanup code by stripping empty strings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6285
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6286
        .replace(reEmptyStringMiddle, '$1')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6287
        .replace(reEmptyStringTrailing, '$1;');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6288
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6289
      // frame code as the function body
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6290
      source = 'function(' + variable + ') {\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6291
        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6292
        "var __t, __p = '', __e = _.escape" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6293
        (isEvaluating
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6294
          ? ', __j = Array.prototype.join;\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6295
            "function print() { __p += __j.call(arguments, '') }\n"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6296
          : ';\n'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6297
        ) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6298
        source +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6299
        'return __p\n}';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6300
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6301
      // Use a sourceURL for easier debugging.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6302
      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6303
      var sourceURL = '\n/*\n//# sourceURL=' + (options.sourceURL || '/lodash/template/source[' + (templateCounter++) + ']') + '\n*/';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6304
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6305
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6306
        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6307
      } catch(e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6308
        e.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6309
        throw e;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6310
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6311
      if (data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6312
        return result(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6313
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6314
      // provide the compiled function's source by its `toString` method, in
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6315
      // supported environments, or the `source` property as a convenience for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6316
      // inlining compiled templates during the build process
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6317
      result.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6318
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6319
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6320
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6321
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6322
     * Executes the callback `n` times, returning an array of the results
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6323
     * of each callback execution. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6324
     * with one argument; (index).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6325
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6326
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6327
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6328
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6329
     * @param {number} n The number of times to execute the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6330
     * @param {Function} callback The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6331
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6332
     * @returns {Array} Returns an array of the results of each `callback` execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6333
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6334
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6335
     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6336
     * // => [3, 6, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6337
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6338
     * _.times(3, function(n) { mage.castSpell(n); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6339
     * // => calls `mage.castSpell(n)` three times, passing `n` of `0`, `1`, and `2` respectively
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6340
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6341
     * _.times(3, function(n) { this.cast(n); }, mage);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6342
     * // => also calls `mage.castSpell(n)` three times
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6343
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6344
    function times(n, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6345
      n = (n = +n) > -1 ? n : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6346
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6347
          result = Array(n);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6348
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6349
      callback = baseCreateCallback(callback, thisArg, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6350
      while (++index < n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6351
        result[index] = callback(index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6352
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6353
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6354
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6355
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6356
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6357
     * The inverse of `_.escape` this method converts the HTML entities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6358
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6359
     * corresponding characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6360
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6361
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6362
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6363
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6364
     * @param {string} string The string to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6365
     * @returns {string} Returns the unescaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6366
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6367
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6368
     * _.unescape('Fred, Barney &amp; Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6369
     * // => 'Fred, Barney & Pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6370
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6371
    function unescape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6372
      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6373
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6374
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6375
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6376
     * Generates a unique ID. If `prefix` is provided the ID will be appended to it.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6377
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6378
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6379
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6380
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6381
     * @param {string} [prefix] The value to prefix the ID with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6382
     * @returns {string} Returns the unique ID.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6383
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6384
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6385
     * _.uniqueId('contact_');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6386
     * // => 'contact_104'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6387
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6388
     * _.uniqueId();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6389
     * // => '105'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6390
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6391
    function uniqueId(prefix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6392
      var id = ++idCounter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6393
      return String(prefix == null ? '' : prefix) + id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6394
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6395
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6396
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6397
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6398
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6399
     * Creates a `lodash` object that wraps the given value with explicit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6400
     * method chaining enabled.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6401
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6402
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6403
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6404
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6405
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6406
     * @returns {Object} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6407
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6408
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6409
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6410
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6411
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6412
     *   { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6413
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6414
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6415
     * var youngest = _.chain(characters)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6416
     *     .sortBy('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6417
     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6418
     *     .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6419
     *     .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6420
     * // => 'pebbles is 1'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6421
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6422
    function chain(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6423
      value = new lodashWrapper(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6424
      value.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6425
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6426
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6427
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6428
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6429
     * Invokes `interceptor` with the `value` as the first argument and then
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6430
     * returns `value`. The purpose of this method is to "tap into" a method
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6431
     * chain in order to perform operations on intermediate results within
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6432
     * the chain.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6433
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6434
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6435
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6436
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6437
     * @param {*} value The value to provide to `interceptor`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6438
     * @param {Function} interceptor The function to invoke.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6439
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6440
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6441
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6442
     * _([1, 2, 3, 4])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6443
     *  .tap(function(array) { array.pop(); })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6444
     *  .reverse()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6445
     *  .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6446
     * // => [3, 2, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6447
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6448
    function tap(value, interceptor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6449
      interceptor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6450
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6451
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6452
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6453
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6454
     * Enables explicit method chaining on the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6455
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6456
     * @name chain
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6457
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6458
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6459
     * @returns {*} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6460
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6461
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6462
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6463
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6464
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6465
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6466
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6467
     * // without explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6468
     * _(characters).first();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6469
     * // => { 'name': 'barney', 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6470
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6471
     * // with explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6472
     * _(characters).chain()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6473
     *   .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6474
     *   .pick('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6475
     *   .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6476
     * // => { 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6477
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6478
    function wrapperChain() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6479
      this.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6480
      return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6481
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6482
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6483
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6484
     * Produces the `toString` result of the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6485
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6486
     * @name toString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6487
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6488
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6489
     * @returns {string} Returns the string result.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6490
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6491
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6492
     * _([1, 2, 3]).toString();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6493
     * // => '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6494
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6495
    function wrapperToString() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6496
      return String(this.__wrapped__);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6497
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6498
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6499
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6500
     * Extracts the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6501
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6502
     * @name valueOf
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6503
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6504
     * @alias value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6505
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6506
     * @returns {*} Returns the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6507
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6508
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6509
     * _([1, 2, 3]).valueOf();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6510
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6511
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6512
    function wrapperValueOf() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6513
      return this.__wrapped__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6514
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6515
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6516
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6517
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6518
    // add functions that return wrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6519
    lodash.after = after;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6520
    lodash.assign = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6521
    lodash.at = at;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6522
    lodash.bind = bind;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6523
    lodash.bindAll = bindAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6524
    lodash.bindKey = bindKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6525
    lodash.chain = chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6526
    lodash.compact = compact;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6527
    lodash.compose = compose;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6528
    lodash.constant = constant;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6529
    lodash.countBy = countBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6530
    lodash.create = create;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6531
    lodash.createCallback = createCallback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6532
    lodash.curry = curry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6533
    lodash.debounce = debounce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6534
    lodash.defaults = defaults;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6535
    lodash.defer = defer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6536
    lodash.delay = delay;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6537
    lodash.difference = difference;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6538
    lodash.filter = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6539
    lodash.flatten = flatten;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6540
    lodash.forEach = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6541
    lodash.forEachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6542
    lodash.forIn = forIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6543
    lodash.forInRight = forInRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6544
    lodash.forOwn = forOwn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6545
    lodash.forOwnRight = forOwnRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6546
    lodash.functions = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6547
    lodash.groupBy = groupBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6548
    lodash.indexBy = indexBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6549
    lodash.initial = initial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6550
    lodash.intersection = intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6551
    lodash.invert = invert;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6552
    lodash.invoke = invoke;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6553
    lodash.keys = keys;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6554
    lodash.map = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6555
    lodash.mapValues = mapValues;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6556
    lodash.max = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6557
    lodash.memoize = memoize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6558
    lodash.merge = merge;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6559
    lodash.min = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6560
    lodash.omit = omit;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6561
    lodash.once = once;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6562
    lodash.pairs = pairs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6563
    lodash.partial = partial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6564
    lodash.partialRight = partialRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6565
    lodash.pick = pick;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6566
    lodash.pluck = pluck;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6567
    lodash.property = property;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6568
    lodash.pull = pull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6569
    lodash.range = range;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6570
    lodash.reject = reject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6571
    lodash.remove = remove;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6572
    lodash.rest = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6573
    lodash.shuffle = shuffle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6574
    lodash.sortBy = sortBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6575
    lodash.tap = tap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6576
    lodash.throttle = throttle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6577
    lodash.times = times;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6578
    lodash.toArray = toArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6579
    lodash.transform = transform;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6580
    lodash.union = union;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6581
    lodash.uniq = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6582
    lodash.values = values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6583
    lodash.where = where;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6584
    lodash.without = without;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6585
    lodash.wrap = wrap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6586
    lodash.xor = xor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6587
    lodash.zip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6588
    lodash.zipObject = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6589
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6590
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6591
    lodash.collect = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6592
    lodash.drop = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6593
    lodash.each = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6594
    lodash.eachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6595
    lodash.extend = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6596
    lodash.methods = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6597
    lodash.object = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6598
    lodash.select = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6599
    lodash.tail = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6600
    lodash.unique = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6601
    lodash.unzip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6602
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6603
    // add functions to `lodash.prototype`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6604
    mixin(lodash);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6605
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6606
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6607
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6608
    // add functions that return unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6609
    lodash.clone = clone;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6610
    lodash.cloneDeep = cloneDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6611
    lodash.contains = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6612
    lodash.escape = escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6613
    lodash.every = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6614
    lodash.find = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6615
    lodash.findIndex = findIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6616
    lodash.findKey = findKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6617
    lodash.findLast = findLast;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6618
    lodash.findLastIndex = findLastIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6619
    lodash.findLastKey = findLastKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6620
    lodash.has = has;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6621
    lodash.identity = identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6622
    lodash.indexOf = indexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6623
    lodash.isArguments = isArguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6624
    lodash.isArray = isArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6625
    lodash.isBoolean = isBoolean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6626
    lodash.isDate = isDate;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6627
    lodash.isElement = isElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6628
    lodash.isEmpty = isEmpty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6629
    lodash.isEqual = isEqual;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6630
    lodash.isFinite = isFinite;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6631
    lodash.isFunction = isFunction;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6632
    lodash.isNaN = isNaN;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6633
    lodash.isNull = isNull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6634
    lodash.isNumber = isNumber;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6635
    lodash.isObject = isObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6636
    lodash.isPlainObject = isPlainObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6637
    lodash.isRegExp = isRegExp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6638
    lodash.isString = isString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6639
    lodash.isUndefined = isUndefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6640
    lodash.lastIndexOf = lastIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6641
    lodash.mixin = mixin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6642
    lodash.noConflict = noConflict;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6643
    lodash.noop = noop;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6644
    lodash.now = now;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6645
    lodash.parseInt = parseInt;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6646
    lodash.random = random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6647
    lodash.reduce = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6648
    lodash.reduceRight = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6649
    lodash.result = result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6650
    lodash.runInContext = runInContext;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6651
    lodash.size = size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6652
    lodash.some = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6653
    lodash.sortedIndex = sortedIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6654
    lodash.template = template;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6655
    lodash.unescape = unescape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6656
    lodash.uniqueId = uniqueId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6657
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6658
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6659
    lodash.all = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6660
    lodash.any = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6661
    lodash.detect = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6662
    lodash.findWhere = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6663
    lodash.foldl = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6664
    lodash.foldr = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6665
    lodash.include = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6666
    lodash.inject = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6667
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6668
    mixin(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6669
      var source = {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6670
      forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6671
        if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6672
          source[methodName] = func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6673
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6674
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6675
      return source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6676
    }(), false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6677
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6678
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6679
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6680
    // add functions capable of returning wrapped and unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6681
    lodash.first = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6682
    lodash.last = last;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6683
    lodash.sample = sample;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6684
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6685
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6686
    lodash.take = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6687
    lodash.head = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6688
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6689
    forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6690
      var callbackable = methodName !== 'sample';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6691
      if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6692
        lodash.prototype[methodName]= function(n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6693
          var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6694
              result = func(this.__wrapped__, n, guard);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6695
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6696
          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6697
            ? result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6698
            : new lodashWrapper(result, chainAll);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6699
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6700
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6701
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6702
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6703
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6704
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6705
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6706
     * The semantic version number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6707
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6708
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6709
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6710
     * @type string
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6711
     */
456
a3bf10beb710 copy client change to server (grunt copy-server)
rougeronj
parents: 442
diff changeset
  6712
    lodash.VERSION = '2.4.2';
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6713
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6714
    // add "Chaining" functions to the wrapper
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6715
    lodash.prototype.chain = wrapperChain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6716
    lodash.prototype.toString = wrapperToString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6717
    lodash.prototype.value = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6718
    lodash.prototype.valueOf = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6719
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6720
    // add `Array` functions that return unwrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6721
    forEach(['join', 'pop', 'shift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6722
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6723
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6724
        var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6725
            result = func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6726
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6727
        return chainAll
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6728
          ? new lodashWrapper(result, chainAll)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6729
          : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6730
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6731
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6732
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6733
    // add `Array` functions that return the existing wrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6734
    forEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6735
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6736
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6737
        func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6738
        return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6739
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6740
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6741
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6742
    // add `Array` functions that return new wrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6743
    forEach(['concat', 'slice', 'splice'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6744
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6745
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6746
        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6747
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6748
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6749
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6750
    return lodash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6751
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6752
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6753
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6754
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6755
  // expose Lo-Dash
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6756
  var _ = runInContext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6757
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6758
  // some AMD build optimizers like r.js check for condition patterns like the following:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6759
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6760
    // Expose Lo-Dash to the global object even when an AMD loader is present in
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6761
    // case Lo-Dash is loaded with a RequireJS shim config.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6762
    // See http://requirejs.org/docs/api.html#config-shim
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6763
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6764
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6765
    // define as an anonymous module so, through path mapping, it can be
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6766
    // referenced as the "underscore" module
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6767
    define(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6768
      return _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6769
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6770
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6771
  // check for `exports` after `define` in case a build optimizer adds an `exports` object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6772
  else if (freeExports && freeModule) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6773
    // in Node.js or RingoJS
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6774
    if (moduleExports) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6775
      (freeModule.exports = _)._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6776
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6777
    // in Narwhal or Rhino -require
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6778
    else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6779
      freeExports._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6780
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6781
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6782
  else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6783
    // in a browser or Rhino
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6784
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6785
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6786
}.call(this));