server/php/basic/public_html/static/lib/lodash/lodash.js
author rougeronj
Wed, 03 Jun 2015 17:27:46 +0200
changeset 471 e0c7be5dc02c
parent 456 a3bf10beb710
child 461 48235ed6b07d
permissions -rw-r--r--
Add a router to handle fragment identifier Set up a listener of the router in the scene to update it Start Backbone.history (eventlistener of the router) when all the project is loaded Include router.js to all the test file
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));