server/php/basic/public_html/static/lib/lodash/lodash.compat.js
author ymh <ymh.work@gmail.com>
Fri, 22 May 2015 17:48:14 +0200
changeset 442 adb907bba956
child 456 a3bf10beb710
permissions -rw-r--r--
add server php example
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * Build: `lodash -o ./dist/lodash.compat.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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * Available under MIT license <http://lodash.com/license>
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 internally to indicate various things */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
  var indicatorObject = {};
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 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
    26
  var keyPrefix = +new Date + '';
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 size when optimizations are enabled for large arrays */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  var largeArraySize = 75;
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 as the max size of the `arrayPool` and `objectPool` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  var maxPoolSize = 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
  /** Used to detect and test whitespace */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
  var whitespace = (
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    // whitespace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    ' \t\x0B\f\xA0\ufeff' +
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
    // line terminators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    '\n\r\u2028\u2029' +
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
    // unicode category "Zs" space separators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    '\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
    44
  );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
  /** Used to match empty string literals in compiled template source */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
  var reEmptyStringLeading = /\b__p \+= '';/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
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
   * Used to match ES6 template delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
   * 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
    54
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
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 match regexp flags from their coerced string values */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
  var reFlags = /\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 detected named functions */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
  var reFuncName = /^\s*function[ \n\r\t]+\w/;
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 "interpolate" template delimiters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  var reInterpolate = /<%=([\s\S]+?)%>/g;
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 match leading whitespace and zeros to be removed */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
  var reLeadingSpacesAndZeros = RegExp('^[' + whitespace + ']*0+(?=.$)');
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 ensure capturing order of template delimiters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
  var reNoMatch = /($^)/;
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 detect functions containing a `this` reference */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
  var reThis = /\bthis\b/;
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 match unescaped characters in compiled string literals */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  var reUnescapedString = /['\n\r\t\u2028\u2029\\]/g;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  /** Used to assign default `context` object properties */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
  var contextProps = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    'RegExp', 'String', '_', 'attachEvent', 'clearTimeout', 'isFinite', 'isNaN',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    'parseInt', 'setTimeout'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
  ];
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
  /** Used to fix the JScript [[DontEnum]] bug */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
  var shadowedProps = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    'toLocaleString', 'toString', 'valueOf'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
  ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
  /** Used to make template sourceURLs easier to identify */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
  var templateCounter = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  /** `Object#toString` result shortcuts */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
  var argsClass = '[object Arguments]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
      arrayClass = '[object Array]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
      boolClass = '[object Boolean]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
      dateClass = '[object Date]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
      errorClass = '[object Error]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
      funcClass = '[object Function]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
      numberClass = '[object Number]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
      objectClass = '[object Object]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
      regexpClass = '[object RegExp]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
      stringClass = '[object String]';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
  /** Used to identify object classifications that `_.clone` supports */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
  var cloneableClasses = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
  cloneableClasses[funcClass] = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
  cloneableClasses[argsClass] = cloneableClasses[arrayClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
  cloneableClasses[boolClass] = cloneableClasses[dateClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
  cloneableClasses[numberClass] = cloneableClasses[objectClass] =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
  cloneableClasses[regexpClass] = cloneableClasses[stringClass] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
  /** Used as an internal `_.debounce` options object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
  var debounceOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    'leading': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    'maxWait': 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    'trailing': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
  /** Used as the property descriptor for `__bindData__` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
  var descriptor = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    'configurable': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    'enumerable': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    'value': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
    'writable': 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 as the data object for `iteratorTemplate` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  var iteratorData = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    'args': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    'array': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    'bottom': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    'firstArg': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    'init': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    'keys': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    'loop': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    'shadowedProps': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    'support': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    'top': '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    'useHas': false
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
  /** Used to determine if values are of the language type Object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
  var objectTypes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
    'boolean': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    'function': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    'object': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    'number': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    'string': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    'undefined': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
  };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
  /** Used to escape characters for inclusion in compiled string literals */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
  var stringEscapes = {
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
    '\n': 'n',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
    '\r': 'r',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    '\t': 't',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
    '\u2028': 'u2028',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    '\u2029': 'u2029'
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
  /** Used as a reference to the global object */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
  var root = (objectTypes[typeof window] && window) || this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
  /** Detect free variable `exports` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
  /** Detect free variable `module` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
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
  /** Detect the popular CommonJS extension `module.exports` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
  /** 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
   178
  var freeGlobal = objectTypes[typeof global] && global;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    root = freeGlobal;
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
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
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
   * The base implementation of `_.indexOf` without support for binary searches
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
   * or `fromIndex` constraints.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
   * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
   * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
   * @param {number} [fromIndex=0] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
   * @returns {number} Returns the index of the matched value or `-1`.
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
  function baseIndexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    var index = (fromIndex || 0) - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
        length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
      if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
        return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
      }
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 -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
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
   * An implementation of `_.contains` for cache objects that mimics the return
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
   * 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
   210
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
   * @param {Object} cache The cache object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
   * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
   * @returns {number} Returns `0` if `value` is found, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
  function cacheIndexOf(cache, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
    var type = typeof value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    cache = cache.cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
    if (type == 'boolean' || value == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
      return cache[value] ? 0 : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
    if (type != 'number' && type != 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
      type = 'object';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
    var key = type == 'number' ? value : keyPrefix + value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    cache = (cache = cache[type]) && cache[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
    return type == 'object'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
      ? (cache && baseIndexOf(cache, value) > -1 ? 0 : -1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
      : (cache ? 0 : -1);
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
   * Adds a given value to the corresponding cache object.
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
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
   * @param {*} value The value to add to the cache.
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
  function cachePush(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
    var cache = this.cache,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        type = typeof value;
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
    if (type == 'boolean' || value == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
      cache[value] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
    } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
      if (type != 'number' && type != 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        type = 'object';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
      var key = type == 'number' ? value : keyPrefix + value,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
          typeCache = cache[type] || (cache[type] = {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
      if (type == 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        (typeCache[key] || (typeCache[key] = [])).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        typeCache[key] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
   * 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
   263
   * collection is a string value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
   * @param {string} value The character to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
   * @returns {number} Returns the code unit of given character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
  function charAtCallback(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
    return value.charCodeAt(0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
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
   * Used by `sortBy` to compare transformed `collection` elements, stable sorting
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
   * them in ascending order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
   * @param {Object} a The object to compare to `b`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
   * @param {Object} b The object to compare to `a`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
   * @returns {number} Returns the sort order indicator of `1` or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
  function compareAscending(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    var ac = a.criteria,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
        bc = b.criteria,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
        index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
        length = ac.length;
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
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
      var value = ac[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
          other = bc[index];
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
      if (value !== other) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        if (value > other || typeof value == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
          return 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
        if (value < other || typeof other == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
          return -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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
    // 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
   302
    // 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
   303
    // `a` and `b`. See https://github.com/jashkenas/underscore/pull/1247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
    //
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
    // This also ensures a stable sort in V8 and other engines.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    // See http://code.google.com/p/v8/issues/detail?id=90
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    return a.index - b.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
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
   * Creates a cache object to optimize linear searches of large arrays.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
   * @param {Array} [array=[]] The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
   * @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
   316
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
  function createCache(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
    var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
        length = array.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
        first = array[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
        mid = array[(length / 2) | 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
        last = array[length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
    if (first && typeof first == 'object' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        mid && typeof mid == 'object' && last && typeof last == 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
      return false;
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
    var cache = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
    cache['false'] = cache['null'] = cache['true'] = cache['undefined'] = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
    var result = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
    result.array = array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
    result.cache = cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
    result.push = cachePush;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
      result.push(array[index]);
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
    return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
  }
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
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
   * Used by `template` to escape characters for inclusion in compiled
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
   * string literals.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
   * @param {string} match The matched character to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
   * @returns {string} Returns the escaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
  function escapeStringChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    return '\\' + stringEscapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
   * 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
   356
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
   * @returns {Array} The array from the pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
  function getArray() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
    return arrayPool.pop() || [];
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
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
   * 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
   366
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
   * @returns {Object} The object from the pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
  function getObject() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
    return objectPool.pop() || {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
      'array': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
      'cache': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
      'criteria': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
      'false': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
      'index': 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
      'null': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
      'number': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
      'object': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
      'push': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
      'string': null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
      'true': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
      'undefined': false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
      'value': null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
    };
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
   * Checks if `value` is a DOM node in IE < 9.
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
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
   * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
   * @returns {boolean} Returns `true` if the `value` is a DOM node, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
  function isNode(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
    // methods that are `typeof` "string" and still can coerce nodes to strings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
    return typeof value.toString != 'function' && typeof (value + '') == 'string';
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
  /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
   * Releases the given array back to the array pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
   * @param {Array} [array] The array to release.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
  function releaseArray(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
    array.length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
    if (arrayPool.length < maxPoolSize) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
      arrayPool.push(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
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
   * Releases the given object back to the object pool.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
   * @param {Object} [object] The object to release.
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
  function releaseObject(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
    var cache = object.cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
    if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
      releaseObject(cache);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
    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
   426
    if (objectPool.length < maxPoolSize) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
      objectPool.push(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
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
   * 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
   433
   * the `end` index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
   * 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
   436
   * in IE < 9 and to ensure dense arrays are returned.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
   * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
   * @param {Array|Object|string} collection The collection to slice.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
   * @param {number} start The start index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
   * @param {number} end The end index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
   * @returns {Array} Returns the new array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
  function slice(array, start, end) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
    start || (start = 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
    if (typeof end == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
      end = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
    var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
        length = end - start || 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
        result = Array(length < 0 ? 0 : length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
      result[index] = array[start + index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
    return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
  }
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
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
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
   * Create a new `lodash` function using the given context object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
   *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
   * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
   * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
   * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
   * @param {Object} [context=root] The context object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
   * @returns {Function} Returns the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
   */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
  function runInContext(context) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
    // 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
   472
    // after built-in constructors like `Object`, for the creation of literals.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
    // 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
   474
    // See http://es5.github.io/#x11.1.5.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
    /** Native constructor references */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
    var Array = context.Array,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
        Boolean = context.Boolean,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
        Date = context.Date,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
        Error = context.Error,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
        Function = context.Function,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
        Math = context.Math,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
        Number = context.Number,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        Object = context.Object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
        RegExp = context.RegExp,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
        String = context.String,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
        TypeError = context.TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
     * Used for `Array` method references.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
     * Normally `Array.prototype` would suffice, however, using an array literal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
     * avoids issues in Narwhal.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
    var arrayRef = [];
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
    /** Used for native method references */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
    var errorProto = Error.prototype,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
        objectProto = Object.prototype,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
        stringProto = String.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
    /** Used to restore the original `_` reference in `noConflict` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
    var oldDash = context._;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
    /** Used to resolve the internal [[Class]] of values */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
    var toString = objectProto.toString;
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 detect if a method is native */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
    var reNative = RegExp('^' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
      String(toString)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
        .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
        .replace(/toString| for [^\]]+/g, '.*?') + '$'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
    );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
    /** Native method shortcuts */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
    var ceil = Math.ceil,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
        clearTimeout = context.clearTimeout,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
        floor = Math.floor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        fnToString = Function.prototype.toString,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
        getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
        hasOwnProperty = objectProto.hasOwnProperty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
        push = arrayRef.push,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
        setTimeout = context.setTimeout,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
        splice = arrayRef.splice,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
        unshift = arrayRef.unshift;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
    /** Used to set meta data on functions */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
    var defineProperty = (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
      // IE 8 only accepts DOM elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
        var o = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
            func = isNative(func = Object.defineProperty) && func,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
            result = func(o, o, o) && func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
      } catch(e) { }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
    }());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
    /* 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
   541
    var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
        nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
        nativeIsFinite = context.isFinite,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
        nativeIsNaN = context.isNaN,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
        nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
        nativeMax = Math.max,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
        nativeMin = Math.min,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
        nativeParseInt = context.parseInt,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
        nativeRandom = Math.random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
    /** Used to lookup a built-in constructor by [[Class]] */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
    var ctorByClass = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
    ctorByClass[arrayClass] = Array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
    ctorByClass[boolClass] = Boolean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
    ctorByClass[dateClass] = Date;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
    ctorByClass[funcClass] = Function;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
    ctorByClass[objectClass] = Object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
    ctorByClass[numberClass] = Number;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
    ctorByClass[regexpClass] = RegExp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
    ctorByClass[stringClass] = String;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
    /** Used to avoid iterating non-enumerable properties in IE < 9 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
    var nonEnumProps = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
    nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
    nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
    nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
    nonEnumProps[objectClass] = { 'constructor': true };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
    (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
      var length = shadowedProps.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
        var key = shadowedProps[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
        for (var className in nonEnumProps) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
          if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
            nonEnumProps[className][key] = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
      }
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
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
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
     * 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
   585
     * method chaining.
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
     * 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
   588
     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
     * and `unshift`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
     * 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
   592
     * implicitly or explicitly included in the build.
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
     * The chainable wrapper functions are:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
     * `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
     * `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
     * `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
     * `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
     * `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
     * `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
     * `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
     * `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
     * and `zip`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
     * The non-chainable wrapper functions are:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
     * `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `has`, `identity`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
     * `indexOf`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
     * `isEmpty`, `isEqual`, `isFinite`, `isFunction`, `isNaN`, `isNull`, `isNumber`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `join`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
     * `lastIndexOf`, `mixin`, `noConflict`, `parseInt`, `pop`, `random`, `reduce`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
     * `reduceRight`, `result`, `shift`, `size`, `some`, `sortedIndex`, `runInContext`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
     * `template`, `unescape`, `uniqueId`, and `value`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
     * 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
   618
     * provided, otherwise they return unwrapped values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
     * Explicit chaining can be enabled by using the `_.chain` method.
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
     * @name _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
     * @constructor
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
     * @param {*} value The value to wrap in a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
     * @returns {Object} Returns a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
     * var wrapped = _([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
     * // returns an unwrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
     * wrapped.reduce(function(sum, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
     *   return sum + num;
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
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
     * // returns a wrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
     * var squares = wrapped.map(function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
     *   return num * num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
     * _.isArray(squares);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
     * _.isArray(squares.value());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
    function lodash(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
      // 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
   650
      return (value && typeof value == 'object' && !isArray(value) && hasOwnProperty.call(value, '__wrapped__'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
       ? value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
       : new lodashWrapper(value);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
     * A fast path for creating `lodash` wrapper objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
     * @param {*} value The value to wrap in a `lodash` instance.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
     * @param {boolean} chainAll A flag to enable chaining for all methods
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
     * @returns {Object} Returns a `lodash` instance.
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
    function lodashWrapper(value, chainAll) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
      this.__chain__ = !!chainAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
      this.__wrapped__ = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
    // ensure `new lodashWrapper` is an instance of `lodash`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
    lodashWrapper.prototype = lodash.prototype;
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
     * An object used to flag environments features.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
     * @type Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
    var support = lodash.support = {};
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
    (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
      var ctor = function() { this.x = 1; },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
          object = { '0': 1, 'length': 1 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
          props = [];
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
      ctor.prototype = { 'valueOf': 1, 'y': 1 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
      for (var key in new ctor) { props.push(key); }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
      for (key in arguments) { }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
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
       * Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
       * @type boolean
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
      support.argsClass = toString.call(arguments) == argsClass;
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
       * Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5).
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
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
       * @type boolean
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
      support.argsObject = arguments.constructor == Object && !(arguments instanceof Array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
       * Detect if `name` or `message` properties of `Error.prototype` are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
       * enumerable by default. (IE < 9, Safari < 5.1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
       * @type boolean
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
      support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
       * Detect if `prototype` properties are enumerable by default.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
       * Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
       * (if the prototype or a property on the prototype has been set)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
       * incorrectly sets a function's `prototype` property [[Enumerable]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
       * value to `true`.
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
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
      support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
       * Detect if functions can be decompiled by `Function#toString`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
       * (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
   729
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
      support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
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
       * Detect if `Function#name` is supported (all but IE).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
      support.funcNames = typeof Function.name == 'string';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
       * Detect if `arguments` object indexes are non-enumerable
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
       * (Firefox < 4, IE < 9, PhantomJS, Safari < 5.1).
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
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
      support.nonEnumArgs = key != 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
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
       * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
       * In IE < 9 an objects own properties, shadowing non-enumerable ones, are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
       * made non-enumerable as well (a.k.a the JScript [[DontEnum]] bug).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
       * @type boolean
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
      support.nonEnumShadows = !/valueOf/.test(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
       * Detect if own properties are iterated after inherited properties (all but IE < 9).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
      support.ownLast = props[0] != 'x';
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
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
       * Detect if `Array#shift` and `Array#splice` augment array-like objects correctly.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
       * Firefox < 10, IE compatibility mode, and IE < 9 have buggy Array `shift()`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
       * and `splice()` functions that fail to remove the last element, `value[0]`,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
       * of array-like objects even though the `length` property is set to `0`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
       * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
       * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
      support.spliceObjects = (arrayRef.splice.call(object, 0, 1), !object[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
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
       * Detect lack of support for accessing string characters by index.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
       * IE < 8 can't access characters by index and IE 8 can only access
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
       * characters by index on string literals.
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
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
       * @type boolean
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
      support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
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
       * Detect if a DOM node's [[Class]] is resolvable (all but IE < 9)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
       * and that the JS engine errors when attempting to coerce an object to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
       * a string without a `toString` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
       * @memberOf _.support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
       * @type boolean
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
        support.nodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
      } catch(e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
        support.nodeClass = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
    }(1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
     * 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
   813
     * embedded Ruby (ERB). Change the following template settings to use alternative
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
     * delimiters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
     * @type Object
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
    lodash.templateSettings = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
       * Used to detect `data` property values to be HTML-escaped.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
       * @type RegExp
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
      'escape': /<%-([\s\S]+?)%>/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
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
       * Used to detect code to be evaluated.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
       * @type RegExp
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
      'evaluate': /<%([\s\S]+?)%>/g,
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
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
       * Used to detect `data` property values to inject.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
       * @type RegExp
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
      'interpolate': reInterpolate,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
       * Used to reference the data object in the template text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
       *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
       * @type string
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
      'variable': '',
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
      /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
       * Used to import variables into the compiled template.
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
       * @memberOf _.templateSettings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
       * @type Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
       */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
      'imports': {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
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
         * A reference to the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
         *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
         * @memberOf _.templateSettings.imports
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
         * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
         */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
        '_': lodash
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
      }
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
     * The template used to create iterator functions.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
     * @param {Object} data The data object used to populate the text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
     * @returns {string} Returns the interpolated text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
    var iteratorTemplate = function(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
      var __p = 'var index, iterable = ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
      (obj.firstArg) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
      ', result = ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
      (obj.init) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
      ';\nif (!iterable) return result;\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
      (obj.top) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
      ';';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
       if (obj.array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
      __p += '\nvar length = iterable.length; index = -1;\nif (' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
      (obj.array) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
      ') {  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
       if (support.unindexedChars) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
      __p += '\n  if (isString(iterable)) {\n    iterable = iterable.split(\'\')\n  }  ';
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
      __p += '\n  while (++index < length) {\n    ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
      (obj.loop) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
      ';\n  }\n}\nelse {  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
       } else if (support.nonEnumArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
      __p += '\n  var length = iterable.length; index = -1;\n  if (length && isArguments(iterable)) {\n    while (++index < length) {\n      index += \'\';\n      ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
      (obj.loop) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
      ';\n    }\n  } else {  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
       }
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
       if (support.enumPrototypes) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
      __p += '\n  var skipProto = typeof iterable == \'function\';\n  ';
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
       if (support.enumErrorProps) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
      __p += '\n  var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
       }
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
          var conditions = [];    if (support.enumPrototypes) { conditions.push('!(skipProto && index == "prototype")'); }    if (support.enumErrorProps)  { conditions.push('!(skipErrorProps && (index == "message" || index == "name"))'); }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
       if (obj.useHas && obj.keys) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
      __p += '\n  var ownIndex = -1,\n      ownProps = objectTypes[typeof iterable] && keys(iterable),\n      length = ownProps ? ownProps.length : 0;\n\n  while (++ownIndex < length) {\n    index = ownProps[ownIndex];\n';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
          if (conditions.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
      __p += '    if (' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
      (conditions.join(' && ')) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
      ') {\n  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
       }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
      __p +=
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
      (obj.loop) +
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
       if (conditions.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
      __p += '\n    }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
       }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
      __p += '\n  }  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
       } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
      __p += '\n  for (index in iterable) {\n';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
          if (obj.useHas) { conditions.push("hasOwnProperty.call(iterable, index)"); }    if (conditions.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
      __p += '    if (' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
      (conditions.join(' && ')) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
      ') {\n  ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
       }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
      __p +=
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
      (obj.loop) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
      ';    ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
       if (conditions.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
      __p += '\n    }';
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
      __p += '\n  }    ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
       if (support.nonEnumShadows) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
      __p += '\n\n  if (iterable !== objectProto) {\n    var ctor = iterable.constructor,\n        isProto = iterable === (ctor && ctor.prototype),\n        className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n        nonEnum = nonEnumProps[className];\n      ';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
       for (k = 0; k < 7; k++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
      __p += '\n    index = \'' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
      (obj.shadowedProps[k]) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
      '\';\n    if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
              if (!obj.useHas) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
      __p += ' || (!nonEnum[index] && iterable[index] !== objectProto[index])';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
       }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
      __p += ') {\n      ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
      (obj.loop) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
      ';\n    }      ';
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
      __p += '\n  }    ';
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
       }
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
       if (obj.array || support.nonEnumArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
      __p += '\n}';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
       }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
      __p +=
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
      (obj.bottom) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
      ';\nreturn result';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
      return __p
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
    };
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
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
     * The base implementation of `_.bind` that creates the bound function and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
     * sets its meta data.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
     * @param {Array} bindData The bind data array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
    function baseBind(bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
      var func = bindData[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
          partialArgs = bindData[2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
          thisArg = bindData[4];
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
      function bound() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
        // `Function#bind` spec
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
        // http://es5.github.io/#x15.3.4.5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
        if (partialArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
          // avoid `arguments` object deoptimizations by using `slice` instead
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
          // of `Array.prototype.slice.call` and not assigning `arguments` to a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
          // variable as a ternary expression
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
          var args = slice(partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
          push.apply(args, arguments);
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
        // mimic the constructor's `return` behavior
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
        // http://es5.github.io/#x13.2.2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
        if (this instanceof bound) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
          // ensure `new bound` is an instance of `func`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
          var thisBinding = baseCreate(func.prototype),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
              result = func.apply(thisBinding, args || arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
          return isObject(result) ? result : thisBinding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
        return func.apply(thisArg, args || arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
      setBindData(bound, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
      return bound;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
     * The base implementation of `_.clone` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
     * for `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
     * @param {*} value The value to clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
     * @param {boolean} [isDeep=false] Specify a deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
     * @param {Array} [stackA=[]] Tracks traversed source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
     * @param {Array} [stackB=[]] Associates clones with source counterparts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
     * @returns {*} Returns the cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
    function baseClone(value, isDeep, callback, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
        var result = callback(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
        if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
          return result;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
      // inspect [[Class]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
      var isObj = isObject(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
      if (isObj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
        var className = toString.call(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
        if (!cloneableClasses[className] || (!support.nodeClass && isNode(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
          return value;
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
        var ctor = ctorByClass[className];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
        switch (className) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
          case boolClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
          case dateClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
            return new ctor(+value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
          case numberClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
          case stringClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
            return new ctor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
          case regexpClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
            result = ctor(value.source, reFlags.exec(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
            result.lastIndex = value.lastIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
            return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
        return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
      var isArr = isArray(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
      if (isDeep) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
        // check for circular references and return corresponding clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
        var initedStack = !stackA;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
        stackA || (stackA = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
        stackB || (stackB = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
        var length = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
          if (stackA[length] == value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
            return stackB[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
        result = isArr ? ctor(value.length) : {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
      else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
        result = isArr ? slice(value) : assign({}, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
      // add array properties assigned by `RegExp#exec`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
      if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
        if (hasOwnProperty.call(value, 'index')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
          result.index = value.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
        if (hasOwnProperty.call(value, 'input')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
          result.input = value.input;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
      // exit for shallow clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
      if (!isDeep) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
      // add the source value to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
      // and associate it with its clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
      stackA.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
      stackB.push(result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
      // recursively populate clone (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
      (isArr ? baseEach : forOwn)(value, function(objValue, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
        result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
      if (initedStack) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
        releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
        releaseArray(stackB);
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
     * The base implementation of `_.create` without support for assigning
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
     * properties to the created object.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
     * @param {Object} prototype The object to inherit from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
     * @returns {Object} Returns the new object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
    function baseCreate(prototype, properties) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
      return isObject(prototype) ? nativeCreate(prototype) : {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
    // fallback for browsers without `Object.create`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
    if (!nativeCreate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
      baseCreate = (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
        function Object() {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
        return function(prototype) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
          if (isObject(prototype)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
            Object.prototype = prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
            var result = new Object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
            Object.prototype = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
          return result || context.Object();
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
      }());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
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
     * The base implementation of `_.createCallback` without support for creating
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
     * "_.pluck" or "_.where" style callbacks.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
     * @param {*} [func=identity] The value to convert to a callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
     * @param {*} [thisArg] The `this` binding of the created callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
     * @param {number} [argCount] The number of arguments the callback accepts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
     * @returns {Function} Returns a callback function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
    function baseCreateCallback(func, thisArg, argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
      if (typeof func != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
        return identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
      // exit early for no `thisArg` or already bound by `Function#bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
      if (typeof thisArg == 'undefined' || !('prototype' in func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
        return func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
      var bindData = func.__bindData__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
      if (typeof bindData == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
        if (support.funcNames) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
          bindData = !func.name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
        bindData = bindData || !support.funcDecomp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
        if (!bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
          var source = fnToString.call(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
          if (!support.funcNames) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
            bindData = !reFuncName.test(source);
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
          if (!bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
            // checks if `func` references the `this` keyword and stores the result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
            bindData = reThis.test(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
            setBindData(func, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
        }
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
      // 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
  1166
      if (bindData === false || (bindData !== true && bindData[1] & 1)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
        return func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
      switch (argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
        case 1: return function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
          return func.call(thisArg, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
        case 2: return function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
          return func.call(thisArg, a, b);
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
        case 3: return function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
          return func.call(thisArg, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
        case 4: return function(accumulator, value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
          return func.call(thisArg, accumulator, value, index, collection);
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
      return bind(func, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
     * The base implementation of `createWrapper` that creates the wrapper and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
     * sets its meta data.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
     * @param {Array} bindData The bind data array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
     * @returns {Function} Returns the new function.
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
    function baseCreateWrapper(bindData) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
      var func = bindData[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
          bitmask = bindData[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
          partialArgs = bindData[2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
          partialRightArgs = bindData[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
          thisArg = bindData[4],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
          arity = bindData[5];
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
      var isBind = bitmask & 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
          isBindKey = bitmask & 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
          isCurry = bitmask & 4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
          isCurryBound = bitmask & 8,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
          key = func;
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
      function bound() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
        var thisBinding = isBind ? thisArg : this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
        if (partialArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
          var args = slice(partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
          push.apply(args, arguments);
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
        if (partialRightArgs || isCurry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
          args || (args = slice(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
          if (partialRightArgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
            push.apply(args, partialRightArgs);
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
          if (isCurry && args.length < arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
            bitmask |= 16 & ~32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
            return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
        args || (args = arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
        if (isBindKey) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
          func = thisBinding[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
        if (this instanceof bound) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
          thisBinding = baseCreate(func.prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
          var result = func.apply(thisBinding, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
          return isObject(result) ? result : thisBinding;
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
        return func.apply(thisBinding, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
      setBindData(bound, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
      return bound;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
     * The base implementation of `_.difference` that accepts a single array
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
     * of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
     * @param {Array} [values] The array of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
    function baseDifference(array, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
          isLarge = length >= largeArraySize && indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
          result = [];
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
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
        var cache = createCache(values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
        if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
          indexOf = cacheIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
          values = cache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
          isLarge = false;
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
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
        if (indexOf(values, value) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
        releaseObject(values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
      return 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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
     * The base implementation of `_.flatten` without support for callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
     * shorthands or `thisArg` binding.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
     * @param {Array} array The array to flatten.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
     * @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
  1283
     * @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
  1284
     * @param {number} [fromIndex=0] The index to start from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
     * @returns {Array} Returns a new flattened array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
    function baseFlatten(array, isShallow, isStrict, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
      var index = (fromIndex || 0) - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
          result = [];
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
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
        if (value && typeof value == 'object' && typeof value.length == 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
            && (isArray(value) || isArguments(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
          // recursively flatten arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
          if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
            value = baseFlatten(value, isShallow, isStrict);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
          var valIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
              valLength = value.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
              resIndex = result.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
          result.length += valLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
          while (++valIndex < valLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
            result[resIndex++] = value[valIndex];
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
        } else if (!isStrict) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
          result.push(value);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
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
     * The base implementation of `_.isEqual`, without support for `thisArg` binding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
     * that allows partial "_.where" style comparisons.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
     * @param {*} a The value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
     * @param {*} b The other value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
     * @param {Function} [callback] The function to customize comparing values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
     * @param {Function} [isWhere=false] A flag to indicate performing partial comparisons.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
     * @param {Array} [stackA=[]] Tracks traversed `a` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
     * @param {Array} [stackB=[]] Tracks traversed `b` objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
    function baseIsEqual(a, b, callback, isWhere, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
      // 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
  1331
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
        var result = callback(a, b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
        if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
          return !!result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
        }
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
      // exit early for identical values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
      if (a === b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
        // treat `+0` vs. `-0` as not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
        return a !== 0 || (1 / a == 1 / b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
      var type = typeof a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
          otherType = typeof b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
      // exit early for unlike primitive values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
      if (a === a &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
          !(a && objectTypes[type]) &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
          !(b && objectTypes[otherType])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
      // 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
  1352
      // http://es5.github.io/#x15.3.4.4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
      if (a == null || b == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
        return a === b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
      // compare [[Class]] names
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
      var className = toString.call(a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
          otherClass = toString.call(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
      if (className == argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
        className = objectClass;
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
      if (otherClass == argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
        otherClass = objectClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
      if (className != otherClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
      switch (className) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
        case boolClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
        case dateClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
          // coerce dates and booleans to numbers, dates to milliseconds and booleans
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
          // 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
  1374
          return +a == +b;
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
        case numberClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
          // treat `NaN` vs. `NaN` as equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
          return (a != +a)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
            ? b != +b
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
            // but treat `+0` vs. `-0` as not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
            : (a == 0 ? (1 / a == 1 / b) : a == +b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
        case regexpClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
        case stringClass:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
          // 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
  1386
          // treat string primitives and their corresponding object instances as equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
          return a == String(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
      var isArr = className == arrayClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
      if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
        // unwrap any `lodash` wrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
        var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
            bWrapped = hasOwnProperty.call(b, '__wrapped__');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
        if (aWrapped || bWrapped) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
          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
  1397
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
        // exit for functions and DOM nodes
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
        if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
          return false;
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
        // in older versions of Opera, `arguments` objects have `Array` constructors
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
        var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
            ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
        // non `Object` object instances with different constructors are not equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
        if (ctorA != ctorB &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
              !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
              ('constructor' in a && 'constructor' in b)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
            ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
          return 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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
      // assume cyclic structures are equal
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
      // 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
  1416
      // 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
  1417
      var initedStack = !stackA;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
      stackA || (stackA = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
      stackB || (stackB = getArray());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
      var length = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
        if (stackA[length] == a) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
          return stackB[length] == b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
        }
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
      var size = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
      result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
      // add `a` and `b` to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
      stackA.push(a);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
      stackB.push(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
      // recursively compare objects and arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
      if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
        // compare lengths to determine if a deep comparison is necessary
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
        length = a.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
        size = b.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
        result = size == length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
        if (result || isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
          // deep compare the contents, ignoring non-numeric properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
          while (size--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
            var index = length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
                value = b[size];
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
            if (isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
              while (index--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
                if ((result = baseIsEqual(a[index], value, callback, isWhere, stackA, stackB))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
                  break;
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
            } else if (!(result = baseIsEqual(a[size], value, callback, isWhere, stackA, stackB))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
              break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
        }
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
      else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
        // 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
  1461
        // which, in this case, is more costly
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
        forIn(b, function(value, key, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
          if (hasOwnProperty.call(b, key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
            // count the number of properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
            size++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
            // deep compare each property value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
            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
  1468
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
        });
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
        if (result && !isWhere) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
          // ensure both objects have the same number of properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
          forIn(a, function(value, key, a) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
            if (hasOwnProperty.call(a, key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
              // `size` will be `-1` if `a` has more properties than `b`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
              return (result = --size > -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
            }
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
      stackA.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
      stackB.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
      if (initedStack) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
        releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
        releaseArray(stackB);
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
      return result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
     * The base implementation of `_.merge` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
     * for `thisArg` binding.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
     * @param {Object} source The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
     * @param {Function} [callback] The function to customize merging properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
     * @param {Array} [stackA=[]] Tracks traversed source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
     * @param {Array} [stackB=[]] Associates values with source counterparts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
    function baseMerge(object, source, callback, stackA, stackB) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
      (isArray(source) ? forEach : forOwn)(source, function(source, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
        var found,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
            isArr,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
            result = source,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
            value = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
        if (source && ((isArr = isArray(source)) || isPlainObject(source))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
          // avoid merging previously merged cyclic sources
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
          var stackLength = stackA.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
          while (stackLength--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
            if ((found = stackA[stackLength] == source)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
              value = stackB[stackLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
              break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
          if (!found) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
            var isShallow;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
            if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
              result = callback(value, source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
              if ((isShallow = typeof result != 'undefined')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
                value = result;
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
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
            if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
              value = isArr
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
                ? (isArray(value) ? value : [])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
                : (isPlainObject(value) ? value : {});
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
            // add `source` and associated `value` to the stack of traversed objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
            stackA.push(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
            stackB.push(value);
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
            // recursively merge objects and arrays (susceptible to call stack limits)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
            if (!isShallow) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
              baseMerge(value, source, callback, stackA, stackB);
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
        else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
          if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
            result = callback(value, source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
            if (typeof result == 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
              result = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
          if (typeof result != 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
            value = result;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
        object[key] = value;
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
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
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
     * The base implementation of `_.random` without argument juggling or support
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
     * for returning floating-point numbers.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
     * @param {number} min The minimum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
     * @param {number} max The maximum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
     * @returns {number} Returns a random number.
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
    function baseRandom(min, max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
      return min + floor(nativeRandom() * (max - min + 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
     * The base implementation of `_.uniq` without support for callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
     * or `thisArg` binding.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
     * @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
  1576
     * @param {Function} [callback] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
     * @returns {Array} Returns a duplicate-value-free array.
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
    function baseUniq(array, isSorted, callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
          result = [];
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
      var isLarge = !isSorted && length >= largeArraySize && indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
          seen = (callback || isLarge) ? getArray() : result;
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
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
        var cache = createCache(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
        indexOf = cacheIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
        seen = cache;
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
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
        var value = array[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
            computed = callback ? callback(value, index, array) : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
        if (isSorted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
              ? !index || seen[seen.length - 1] !== computed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
              : indexOf(seen, computed) < 0
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
          if (callback || isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
            seen.push(computed);
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
          result.push(value);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
      if (isLarge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
        releaseArray(seen.array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
        releaseObject(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
      } else if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
        releaseArray(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
      return result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
     * Creates a function that aggregates a collection, creating an object composed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
     * 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
  1619
     * 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
  1620
     * of the composed object.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
     * @param {Function} setter The setter function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
     * @returns {Function} Returns the new aggregator function.
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
    function createAggregator(setter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
      return function(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
        var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
        if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
          var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
              length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
          while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
            var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
            setter(result, value, callback(value, index, collection), collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
          baseEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
            setter(result, value, callback(value, key, collection), collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
          });
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
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
    }
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
     * Creates a function that, when called, either curries or invokes `func`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
     * with an optional `this` binding and partially applied arguments.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
     * @param {Function|string} func The function or method name to reference.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
     * @param {number} bitmask The bitmask of method flags to compose.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
     *  The bitmask may be composed of the following flags:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
     *  1 - `_.bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
     *  2 - `_.bindKey`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
     *  4 - `_.curry`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
     *  8 - `_.curry` (bound)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
     *  16 - `_.partial`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
     *  32 - `_.partialRight`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
     * @param {Array} [partialArgs] An array of arguments to prepend to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
     *  provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
     * @param {Array} [partialRightArgs] An array of arguments to append to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
     *  provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
     * @param {*} [thisArg] The `this` binding of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
     * @param {number} [arity] The arity of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
    function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
      var isBind = bitmask & 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
          isBindKey = bitmask & 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
          isCurry = bitmask & 4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
          isCurryBound = bitmask & 8,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
          isPartial = bitmask & 16,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
          isPartialRight = bitmask & 32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
      if (!isBindKey && !isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
      if (isPartial && !partialArgs.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
        bitmask &= ~16;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
        isPartial = partialArgs = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
      if (isPartialRight && !partialRightArgs.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
        bitmask &= ~32;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
        isPartialRight = partialRightArgs = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
      var bindData = func && func.__bindData__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
      if (bindData && bindData !== true) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
        // clone `bindData`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
        bindData = slice(bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
        if (bindData[2]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
          bindData[2] = slice(bindData[2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
        if (bindData[3]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
          bindData[3] = slice(bindData[3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
        // set `thisBinding` is not previously bound
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
        if (isBind && !(bindData[1] & 1)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
          bindData[4] = thisArg;
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
        // set if previously bound but not currently (subsequent curried functions)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
        if (!isBind && bindData[1] & 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
          bitmask |= 8;
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
        // set curried arity if not yet set
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
        if (isCurry && !(bindData[1] & 4)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
          bindData[5] = arity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
        // append partial left arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
        if (isPartial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
          push.apply(bindData[2] || (bindData[2] = []), partialArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
        // append partial right arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
        if (isPartialRight) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
          unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
        // merge flags
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
        bindData[1] |= bitmask;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
        return createWrapper.apply(null, bindData);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
      // fast path for `_.bind`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
      var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
      return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
    }
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
     * Creates compiled iteration functions.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
     * @param {...Object} [options] The compile options object(s).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
     * @param {string} [options.array] Code to determine if the iterable is an array or array-like.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
     * @param {boolean} [options.useHas] Specify using `hasOwnProperty` checks in the object loop.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
     * @param {Function} [options.keys] A reference to `_.keys` for use in own property iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
     * @param {string} [options.args] A comma separated string of iteration function arguments.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
     * @param {string} [options.top] Code to execute before the iteration branches.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
     * @param {string} [options.loop] Code to execute in the object loop.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
     * @param {string} [options.bottom] Code to execute after the iteration branches.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
     * @returns {Function} Returns the compiled function.
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
    function createIterator() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
      // data properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
      iteratorData.shadowedProps = shadowedProps;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
      // iterator options
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
      iteratorData.array = iteratorData.bottom = iteratorData.loop = iteratorData.top = '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
      iteratorData.init = 'iterable';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
      iteratorData.useHas = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
      // merge options into a template data object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
      for (var object, index = 0; object = arguments[index]; index++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
        for (var key in object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
          iteratorData[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
        }
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
      var args = iteratorData.args;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
      iteratorData.firstArg = /^[^,]+/.exec(args)[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
      // create the function factory
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
      var factory = Function(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
          'baseCreateCallback, errorClass, errorProto, hasOwnProperty, ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
          'indicatorObject, isArguments, isArray, isString, keys, objectProto, ' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
          'objectTypes, nonEnumProps, stringClass, stringProto, toString',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
        'return function(' + args + ') {\n' + iteratorTemplate(iteratorData) + '\n}'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
      );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
      // return the compiled function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
      return factory(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
        baseCreateCallback, errorClass, errorProto, hasOwnProperty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
        indicatorObject, isArguments, isArray, isString, iteratorData.keys, objectProto,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
        objectTypes, nonEnumProps, stringClass, stringProto, toString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
      );
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
     * Used by `escape` to convert characters to HTML entities.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
     * @param {string} match The matched character to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
     * @returns {string} Returns the escaped character.
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
    function escapeHtmlChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
      return htmlEscapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
     * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
     * customized, this method returns the custom method, otherwise it returns
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1790
     * the `baseIndexOf` function.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1793
     * @returns {Function} Returns the "indexOf" function.
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
    function getIndexOf() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1796
      var result = (result = lodash.indexOf) === indexOf ? baseIndexOf : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1797
      return result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1800
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1801
     * Checks if `value` is a native function.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1804
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1805
     * @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
  1806
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1807
    function isNative(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1808
      return typeof value == 'function' && reNative.test(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1809
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1810
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1811
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1812
     * Sets `this` binding data on a given function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1813
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1814
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1815
     * @param {Function} func The function to set data on.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1816
     * @param {Array} value The data array to set.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1817
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1818
    var setBindData = !defineProperty ? noop : function(func, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1819
      descriptor.value = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1820
      defineProperty(func, '__bindData__', descriptor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1821
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1822
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
     * A fallback implementation of `isPlainObject` which checks if a given value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
     * is an object created by the `Object` constructor, assuming objects created
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
     * by the `Object` constructor have no inherited enumerable properties and that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
     * there are no `Object.prototype` extensions.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
     * @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
  1832
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1833
    function shimIsPlainObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
      var ctor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
      // avoid non Object objects, `arguments` objects, and DOM elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
      if (!(value && toString.call(value) == objectClass) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
          (!support.argsClass && isArguments(value)) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
          (!support.nodeClass && isNode(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
        return false;
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
      // IE < 9 iterates inherited properties before own properties. If the first
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
      // iterated property is an object's own property then there are no inherited
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
      // enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1847
      if (support.ownLast) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
        forIn(value, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
          result = hasOwnProperty.call(object, key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
        return result !== false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
      // In most environments an object's own properties are iterated before
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
      // 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
  1856
      // own property then there are no inherited enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1857
      forIn(value, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
        result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
      return typeof result == 'undefined' || hasOwnProperty.call(value, result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1862
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1863
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1864
     * Used by `unescape` to convert HTML entities to characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
     * @param {string} match The matched character to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
     * @returns {string} Returns the unescaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
    function unescapeHtmlChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
      return htmlUnescapes[match];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1873
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1874
    /*--------------------------------------------------------------------------*/
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
     * Checks if `value` is an `arguments` object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
     * @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
  1884
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1885
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
     * (function() { return _.isArguments(arguments); })(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
     * _.isArguments([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
     * // => 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
    function isArguments(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
        toString.call(value) == argsClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
    // fallback for browsers that can't detect `arguments` objects by [[Class]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
    if (!support.argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
      isArguments = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
        return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
          hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
      };
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1904
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1905
     * Checks if `value` is an array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
     * @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
  1913
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1914
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
     * (function() { return _.isArray(arguments); })();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
     * // => false
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
     * _.isArray([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
    var isArray = nativeIsArray || function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
        toString.call(value) == arrayClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1925
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1926
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1927
     * 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
  1928
     * given object's own enumerable property names.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
     * @returns {Array} Returns an array of property names.
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
    var shimKeys = createIterator({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
      'args': 'object',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
      'init': '[]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
      'top': 'if (!(objectTypes[typeof object])) return result',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
      'loop': 'result.push(index)'
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1942
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1943
     * 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
  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 inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
     * @returns {Array} Returns an array of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
    var keys = !nativeKeys ? shimKeys : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
        return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
      if ((support.enumPrototypes && typeof object == 'function') ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
          (support.nonEnumArgs && object.length && isArguments(object))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
        return shimKeys(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
      return nativeKeys(object);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1966
    /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
    var eachIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
      'args': 'collection, callback, thisArg',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
      'top': "callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
      'array': "typeof length == 'number'",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
      'keys': keys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
      'loop': 'if (callback(iterable[index], index, collection) === false) return result'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
    };
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
    /** Reusable iterator options for `assign` and `defaults` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
    var defaultsIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
      'args': 'object, source, guard',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
      'top':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
        'var args = arguments,\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
        '    argsIndex = 0,\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
        "    argsLength = typeof guard == 'number' ? 2 : args.length;\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
        'while (++argsIndex < argsLength) {\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
        '  iterable = args[argsIndex];\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
        '  if (iterable && objectTypes[typeof iterable]) {',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
      'keys': keys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
      'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
      'bottom': '  }\n}'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1989
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1990
    /** Reusable iterator options for `forIn` and `forOwn` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
    var forOwnIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
      'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
      'array': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1995
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1996
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1997
     * Used to convert characters to HTML entities:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
     * Though the `>` character is escaped for symmetry, characters like `>` and `/`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
     * 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
  2001
     * of a tag or an unquoted attribute value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2002
     * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
    var htmlEscapes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
      '&': '&amp;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
      '<': '&lt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
      '>': '&gt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
      '"': '&quot;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
      "'": '&#39;'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
    };
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
    /** Used to convert HTML entities to characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
    var htmlUnescapes = invert(htmlEscapes);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
    /** Used to match HTML entities and HTML characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2019
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2020
     * A function compiled to iterate `arguments` objects, arrays, objects, and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
     * strings consistenly across environments, executing the callback for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
     * element in the collection. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
     * with three arguments; (value, index|key, collection). Callbacks may exit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2024
     * iteration early by explicitly returning `false`.
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
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
     * @returns {Array|Object|string} Returns `collection`.
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
    var baseEach = createIterator(eachIteratorOptions);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2035
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2036
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2037
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2038
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
     * object. Subsequent sources will overwrite property assignments of previous
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
     * 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
  2041
     * 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
  2042
     * arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2043
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
     * @alias extend
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
     * @param {Function} [callback] The function to customize assigning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2055
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2056
     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2057
     * // => { 'name': 'fred', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2058
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2059
     * var defaults = _.partialRight(_.assign, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2060
     *   return typeof a == 'undefined' ? b : a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2061
     * });
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
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2064
     * defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2065
     * // => { 'name': 'barney', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2066
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2067
    var assign = createIterator(defaultsIteratorOptions, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2068
      'top':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2069
        defaultsIteratorOptions.top.replace(';',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2070
          ';\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2071
          "if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2072
          '  var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2073
          "} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2074
          '  callback = args[--argsLength];\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2075
          '}'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2076
        ),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2077
      'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2078
    });
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2081
     * 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
  2082
     * 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
  2083
     * 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
  2084
     * callback returns `undefined` cloning will be handled by the method instead.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2085
     * 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
  2086
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2087
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2088
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2089
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2090
     * @param {*} value The value to clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2091
     * @param {boolean} [isDeep=false] Specify a deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2092
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2093
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2094
     * @returns {*} Returns the cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2095
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2096
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2097
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2098
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2099
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2100
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2101
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2102
     * var shallow = _.clone(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2103
     * shallow[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2104
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
     * var deep = _.clone(characters, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
     * // => false
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
     * _.mixin({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
     *   'clone': _.partialRight(_.clone, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
     *     return _.isElement(value) ? value.cloneNode(false) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
     *   })
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2116
     * var clone = _.clone(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
     * clone.childNodes.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
    function clone(value, isDeep, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
      // allows working with "Collections" methods without using their `index`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
      // and `collection` arguments for `isDeep` and `callback`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
      if (typeof isDeep != 'boolean' && isDeep != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
        callback = isDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
        isDeep = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2130
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2131
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2132
     * 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
  2133
     * executed to produce the cloned values. If the callback returns `undefined`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2134
     * 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
  2135
     * `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2136
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
     * 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
  2138
     * 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
  2139
     * 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
  2140
     * 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
  2141
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2142
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
     * @param {*} value The value to deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
     * @returns {*} Returns the deep cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2156
     * var deep = _.cloneDeep(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
     *   'node': element
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
     * var clone = _.cloneDeep(view, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
     *   return _.isElement(value) ? value.cloneNode(true) : undefined;
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
     * clone.node == view.node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
     * // => false
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
    function cloneDeep(value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2175
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2176
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2177
     * 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
  2178
     * `properties` object is provided its own enumerable properties are assigned
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2179
     * to the created object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
     * @param {Object} prototype The object to inherit from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
     * @param {Object} [properties] The properties to assign to the object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
     * @returns {Object} Returns the new object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2193
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2194
     * function Circle() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
     *   Shape.call(this);
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2198
     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
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
     * var circle = new Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
     * circle instanceof Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
     * circle instanceof Shape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
    function create(prototype, properties) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
      var result = baseCreate(prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
      return properties ? assign(result, properties) : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
    }
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
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
     * object for all destination properties that resolve to `undefined`. Once a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
     * 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
  2216
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2217
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
     * @param- {Object} [guard] Allows working with `_.reduce` without using its
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
     *  `key` and `object` arguments as sources.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
     * // => { 'name': 'barney', 'employer': 'slate' }
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
    var defaults = createIterator(defaultsIteratorOptions);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2235
     * 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
  2236
     * 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
  2237
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2238
     * 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
  2239
     * callback will return the property value of the given element.
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
     * 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
  2242
     * 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
  2243
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2244
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
     *  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
  2251
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2252
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
     * @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
  2254
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2255
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
     *   'barney': {  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
     *   'fred': {    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
     *   'pebbles': { 'age': 1,  'blocked': false }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2262
     * _.findKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
     *   return chr.age < 40;
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
     * // => 'barney' (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
     * _.findKey(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
     * _.findKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
     * // => 'fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
    function findKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
          return false;
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2284
      return result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2287
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2288
     * This method is like `_.findKey` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
     * of a `collection` in the opposite order.
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
     * 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
  2292
     * callback will return the property value of the given element.
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 an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
     * 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
  2296
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
     *  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
  2304
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2305
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
     * @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
  2307
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2308
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
     *   'barney': {  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
     *   'fred': {    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
     *   'pebbles': { 'age': 1,  'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2314
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2315
     * _.findLastKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
     * // => returns `pebbles`, assuming `_.findKey` returns `barney`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
     * _.findLastKey(characters, { 'age': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
     * // => '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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
     * _.findLastKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
    function findLastKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
      forOwnRight(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2336
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2337
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2341
     * Iterates over own and inherited enumerable properties of an object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
     * 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
  2343
     * and invoked with three arguments; (value, key, object). Callbacks may exit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2344
     * iteration early by explicitly returning `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2360
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2361
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
     *   this.y += y;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2366
     * _.forIn(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
     * // => 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
  2370
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2371
    var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
      'useHas': 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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2375
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2376
     * This method is like `_.forIn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
     * of a `collection` in the opposite order.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
     * @returns {Object} Returns `object`.
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
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2392
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2393
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
     *   this.y += y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2397
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2398
     * _.forInRight(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
     * // => 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
  2402
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2403
    function forInRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
      var pairs = [];
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
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
        pairs.push(key, value);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2410
      var length = pairs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2413
        if (callback(pairs[length--], pairs[length], object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2414
          break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2415
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2416
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2417
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2418
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2419
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2420
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2421
     * Iterates over own enumerable properties of an object, executing the callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2422
     * 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
  2423
     * arguments; (value, key, object). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2424
     * explicitly returning `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2427
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2428
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2429
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2430
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2431
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2432
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2433
     * @returns {Object} Returns `object`.
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
     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2437
     *   console.log(key);
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
     * // => 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
  2440
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2441
    var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2443
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2444
     * This method is like `_.forOwn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2445
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2446
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2447
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2448
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2449
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2450
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2451
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2452
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2453
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2454
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2455
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2456
     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2458
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2459
     * // => 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
  2460
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2461
    function forOwnRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2462
      var props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2463
          length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2464
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2465
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2466
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2467
        var key = props[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2468
        if (callback(object[key], key, object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2469
          break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2470
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2471
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2472
      return object;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2476
     * Creates a sorted array of property names of all enumerable properties,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2477
     * own and inherited, of `object` that have function values.
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
     * @alias methods
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2482
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2483
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2484
     * @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
  2485
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2486
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2487
     * _.functions(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2488
     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
    function functions(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
        if (isFunction(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
          result.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
        }
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
      return result.sort();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2499
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2500
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2501
     * 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
  2502
     * instead of an inherited property.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
     * @param {string} key The name of the property to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
     * @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
  2510
     * @example
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
     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
     * // => true
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
    function has(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
      return object ? hasOwnProperty.call(object, key) : false;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2519
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2520
     * 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
  2521
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2522
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
     * @param {Object} object The object to invert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
     * @returns {Object} Returns the created inverted object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
     * @example
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
     * _.invert({ 'first': 'fred', 'second': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
     * // => { 'fred': 'first', 'barney': 'second' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
    function invert(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2533
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2534
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2535
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2536
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2537
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2538
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2539
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2540
        result[object[key]] = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2544
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
     * Checks if `value` is a boolean value.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2549
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2550
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2551
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2552
     * @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
  2553
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2554
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2555
     * _.isBoolean(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2556
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2557
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2558
    function isBoolean(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2559
      return value === true || value === false ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2560
        value && typeof value == 'object' && toString.call(value) == boolClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2561
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2562
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
     * Checks if `value` is a date.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2567
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2568
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2569
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2570
     * @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
  2571
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2572
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2573
     * _.isDate(new Date);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2574
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2575
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2576
    function isDate(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2577
      return value && typeof value == 'object' && toString.call(value) == dateClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2579
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
     * Checks if `value` is a DOM element.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
     * @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
  2588
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2589
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
     * _.isElement(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2591
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2592
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2593
    function isElement(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2594
      return value && value.nodeType === 1 || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2595
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2596
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2597
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2598
     * 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
  2599
     * 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
  2600
     * "empty".
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2601
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2602
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2603
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2604
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2605
     * @param {Array|Object|string} value The value to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2606
     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2607
     * @example
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
     * _.isEmpty([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2610
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2611
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2612
     * _.isEmpty({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2613
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2614
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2615
     * _.isEmpty('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2616
     * // => true
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 isEmpty(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2619
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2620
      if (!value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2621
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2622
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2623
      var className = toString.call(value),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2624
          length = value.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2625
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2626
      if ((className == arrayClass || className == stringClass ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2627
          (support.argsClass ? className == argsClass : isArguments(value))) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2628
          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2629
        return !length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2630
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2631
      forOwn(value, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2632
        return (result = false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2633
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2634
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2635
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2638
     * 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
  2639
     * 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
  2640
     * to compare values. If the callback returns `undefined` comparisons will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2641
     * 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
  2642
     * invoked with two arguments; (a, b).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2643
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2644
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2645
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2646
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2647
     * @param {*} a The value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2648
     * @param {*} b The other value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2649
     * @param {Function} [callback] The function to customize comparing values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2650
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2651
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2652
     * @example
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 object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2655
     * var copy = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2656
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2657
     * object == copy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2658
     * // => false
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
     * _.isEqual(object, copy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2661
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2662
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2663
     * var words = ['hello', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2664
     * var otherWords = ['hi', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2665
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2666
     * _.isEqual(words, otherWords, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2667
     *   var reGreet = /^(?:hello|hi)$/i,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2668
     *       aGreet = _.isString(a) && reGreet.test(a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2669
     *       bGreet = _.isString(b) && reGreet.test(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2670
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2671
     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
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
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2674
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2675
    function isEqual(a, b, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2676
      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2677
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2680
     * 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
  2681
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2682
     * 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
  2683
     * 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
  2684
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2685
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2686
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2687
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2688
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2689
     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2690
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2691
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2692
     * _.isFinite(-101);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2693
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2694
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2695
     * _.isFinite('10');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2696
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2697
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2698
     * _.isFinite(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2699
     * // => false
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
     * _.isFinite('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2702
     * // => false
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
     * _.isFinite(Infinity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2705
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2706
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2707
    function isFinite(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2708
      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2711
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2712
     * Checks if `value` is a function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2713
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2714
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2715
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2716
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2717
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2718
     * @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
  2719
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2720
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2721
     * _.isFunction(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2722
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2723
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2724
    function isFunction(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2725
      return typeof value == 'function';
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
    // fallback for older versions of Chrome and Safari
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2728
    if (isFunction(/x/)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2729
      isFunction = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2730
        return typeof value == 'function' && toString.call(value) == funcClass;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2731
      };
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
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
     * Checks if `value` is the language type of Object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2736
     * (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
  2737
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2738
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2739
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2740
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2741
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2742
     * @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
  2743
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2744
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2745
     * _.isObject({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2746
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2747
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2748
     * _.isObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2749
     * // => true
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
     * _.isObject(1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2752
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2753
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2754
    function isObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2755
      // check if the value is the ECMAScript language type of Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2756
      // http://es5.github.io/#x8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2757
      // and avoid a V8 bug
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2758
      // http://code.google.com/p/v8/issues/detail?id=2291
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2759
      return !!(value && objectTypes[typeof value]);
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
     * Checks if `value` is `NaN`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2764
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2765
     * 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
  2766
     * `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
  2767
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2768
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2769
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2770
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2771
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2772
     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2773
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2774
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2775
     * _.isNaN(NaN);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2776
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2777
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2778
     * _.isNaN(new Number(NaN));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2779
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2780
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2781
     * isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2782
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2783
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2784
     * _.isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2785
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2786
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2787
    function isNaN(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2788
      // `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
  2789
      // (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
  2790
      return isNumber(value) && value != +value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2791
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2792
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2793
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2794
     * Checks if `value` is `null`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2795
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2796
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2797
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2798
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2799
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2800
     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2801
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2802
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2803
     * _.isNull(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2804
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2805
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2806
     * _.isNull(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2807
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2808
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2809
    function isNull(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2810
      return value === null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2811
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2812
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
     * Checks if `value` is a number.
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
     * 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
  2817
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2818
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2819
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2820
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2821
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2822
     * @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
  2823
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2824
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2825
     * _.isNumber(8.4 * 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2826
     * // => true
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
    function isNumber(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2829
      return typeof value == 'number' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2830
        value && typeof value == 'object' && toString.call(value) == numberClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2831
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2832
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2833
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2834
     * Checks if `value` is an object created by the `Object` constructor.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2837
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2838
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2839
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2840
     * @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
  2841
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2842
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2843
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2844
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2845
     *   this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2846
     * }
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
     * _.isPlainObject(new Shape);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2849
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2850
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2851
     * _.isPlainObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2852
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2853
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2854
     * _.isPlainObject({ 'x': 0, 'y': 0 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2855
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2856
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2857
    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2858
      if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2859
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2860
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2861
      var valueOf = value.valueOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2862
          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
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
      return objProto
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2865
        ? (value == objProto || getPrototypeOf(value) == objProto)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2866
        : shimIsPlainObject(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2867
    };
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2870
     * Checks if `value` is a regular expression.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2871
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2872
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2873
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2874
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2875
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2876
     * @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
  2877
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2878
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2879
     * _.isRegExp(/fred/);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2880
     * // => true
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
    function isRegExp(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2883
      return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2884
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2885
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2886
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2887
     * Checks if `value` is a string.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2890
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2891
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2892
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2893
     * @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
  2894
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2895
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2896
     * _.isString('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2897
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2898
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2899
    function isString(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2900
      return typeof value == 'string' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2901
        value && typeof value == 'object' && toString.call(value) == stringClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2902
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2903
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
     * Checks if `value` is `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2906
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2907
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2908
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2909
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2910
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2911
     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2912
     * @example
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
     * _.isUndefined(void 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2915
     * // => true
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
    function isUndefined(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2918
      return typeof value == 'undefined';
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2921
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2922
     * 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
  2923
     * running each own enumerable property of `object` through the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2924
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2925
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2926
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2927
     * 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
  2928
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2929
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2930
     * 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
  2931
     * 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
  2932
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2935
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2936
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2937
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2938
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2939
     *  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
  2940
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2941
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2942
     * @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
  2943
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2944
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2945
     * _.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
  2946
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2947
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2948
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2949
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2950
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2954
     * _.mapValues(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2955
     * // => { 'fred': 40, 'pebbles': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2956
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2957
    function mapValues(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2958
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2959
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2960
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2961
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2962
        result[key] = callback(value, key, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2963
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2964
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2965
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2966
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
     * Recursively merges own enumerable properties of the source object(s), that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2969
     * don't resolve to `undefined` into the destination object. Subsequent sources
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2970
     * will overwrite property assignments of previous sources. If a callback is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2971
     * 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
  2972
     * and source properties. If the callback returns `undefined` merging will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2973
     * 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
  2974
     * invoked with two arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2975
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2976
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2977
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2978
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2979
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2980
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2981
     * @param {Function} [callback] The function to customize merging properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2982
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2983
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2984
     * @example
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
     * var names = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2987
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2988
     *     { 'name': 'barney' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2989
     *     { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2990
     *   ]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2991
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2992
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2993
     * var ages = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2994
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2995
     *     { 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2996
     *     { 'age': 40 }
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
     * };
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
     * _.merge(names, ages);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3001
     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3002
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3003
     * var food = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3004
     *   'fruits': ['apple'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3005
     *   'vegetables': ['beet']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3006
     * };
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
     * var otherFood = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3009
     *   'fruits': ['banana'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3010
     *   'vegetables': ['carrot']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3011
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3012
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3013
     * _.merge(food, otherFood, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3014
     *   return _.isArray(a) ? a.concat(b) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3015
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3016
     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3017
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3018
    function merge(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3019
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3020
          length = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3021
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3022
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3023
        return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3024
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3025
      // allows working with `_.reduce` and `_.reduceRight` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3026
      // their `index` and `collection` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3027
      if (typeof args[2] != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3028
        length = args.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3029
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3030
      if (length > 3 && typeof args[length - 2] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3031
        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3032
      } else if (length > 2 && typeof args[length - 1] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3033
        callback = args[--length];
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 sources = slice(arguments, 1, length),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3036
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3037
          stackA = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3038
          stackB = getArray();
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
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3041
        baseMerge(object, sources[index], callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3042
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3043
      releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3044
      releaseArray(stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3045
      return object;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3048
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3049
     * Creates a shallow clone of `object` excluding the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3050
     * 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
  3051
     * 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
  3052
     * property of `object` omitting the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3053
     * 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
  3054
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3055
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3056
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3057
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3058
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3059
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3060
     * @param {Function|...string|string[]} [callback] The properties to omit or the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3061
     *  function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3062
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3063
     * @returns {Object} Returns an object without the omitted properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3064
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3065
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3066
     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3067
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3068
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3069
     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3070
     *   return typeof value == 'number';
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
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3073
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3074
    function omit(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3075
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3076
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3077
        var props = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3078
        forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3079
          props.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3080
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3081
        props = baseDifference(props, baseFlatten(arguments, true, false, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3082
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3083
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3084
            length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3085
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3086
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3087
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3088
          result[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3089
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3090
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3091
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3092
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3093
          if (!callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3094
            result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3095
          }
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
     * 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
  3103
     * i.e. `[[key1, value1], [key2, value2]]`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3104
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3105
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3106
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3107
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3108
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3109
     * @returns {Array} Returns new array of key-value pairs.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3110
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3111
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3112
     * _.pairs({ 'barney': 36, 'fred': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3113
     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3114
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3115
    function pairs(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3116
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3117
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3118
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3119
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3120
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3121
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3122
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3123
        result[index] = [key, object[key]];
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3126
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3129
     * Creates a shallow clone of `object` composed of the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3130
     * 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
  3131
     * 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
  3132
     * property of `object` picking the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3133
     * 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
  3134
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3135
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3136
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3137
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3138
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3139
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3140
     * @param {Function|...string|string[]} [callback] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3141
     *  iteration or property names to pick, specified as individual property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3142
     *  names or arrays of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3143
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3144
     * @returns {Object} Returns an object composed of the picked properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3145
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3146
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3147
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3148
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3149
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3150
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3151
     *   return key.charAt(0) != '_';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3152
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3153
     * // => { 'name': 'fred' }
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
    function pick(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3156
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3157
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3158
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3159
            props = baseFlatten(arguments, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3160
            length = isObject(object) ? props.length : 0;
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
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3163
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3164
          if (key in object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3165
            result[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3166
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3167
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3168
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3169
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3170
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3171
          if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3172
            result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3173
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3174
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3175
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3176
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3177
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3178
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3179
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3180
     * An alternative to `_.reduce` this method transforms `object` to a new
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3181
     * `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
  3182
     * enumerable properties through a callback, with each callback execution
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3183
     * potentially mutating the `accumulator` object. The callback is bound to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3184
     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3185
     * Callbacks may exit iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3186
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3187
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3188
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3189
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3190
     * @param {Array|Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3191
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3192
     * @param {*} [accumulator] The custom accumulator value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3193
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3194
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3195
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3196
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3197
     * 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
  3198
     *   num *= num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3199
     *   if (num % 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3200
     *     return result.push(num) < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3201
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3202
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3203
     * // => [1, 9, 25]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3204
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3205
     * 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
  3206
     *   result[key] = num * 3;
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
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3209
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3210
    function transform(object, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3211
      var isArr = isArray(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3212
      if (accumulator == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3213
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3214
          accumulator = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3215
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3216
          var ctor = object && object.constructor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3217
              proto = ctor && ctor.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3218
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3219
          accumulator = baseCreate(proto);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3222
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3223
        callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3224
        (isArr ? baseEach : forOwn)(object, function(value, index, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3225
          return callback(accumulator, value, index, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3226
        });
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
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3229
    }
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
     * 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
  3233
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3234
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3235
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3236
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3237
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3238
     * @returns {Array} Returns an array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3239
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3240
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3241
     * _.values({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3242
     * // => [1, 2, 3] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3243
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3244
    function values(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3245
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3246
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3247
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3248
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3249
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3250
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3251
        result[index] = object[props[index]];
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3254
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3255
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3256
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3257
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3258
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3259
     * 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
  3260
     * `collection`. Indexes may be specified as individual arguments or as arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3261
     * of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3262
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3263
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3264
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3265
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3266
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3267
     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3268
     *   to retrieve, specified as individual indexes or arrays of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3269
     * @returns {Array} Returns a new array of elements corresponding to the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3270
     *  provided indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3271
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3272
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3273
     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3274
     * // => ['a', 'c', 'e']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3275
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3276
     * _.at(['fred', 'barney', 'pebbles'], 0, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3277
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3278
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3279
    function at(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3280
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3281
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3282
          props = baseFlatten(args, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3283
          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3284
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3285
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3286
      if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3287
        collection = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3288
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3289
      while(++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3290
        result[index] = collection[props[index]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3291
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3292
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3293
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3296
     * 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
  3297
     * 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
  3298
     * offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3299
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3300
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3301
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3302
     * @alias include
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3303
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3304
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3305
     * @param {*} target The value to check for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3306
     * @param {number} [fromIndex=0] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3307
     * @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
  3308
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3309
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3310
     * _.contains([1, 2, 3], 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3311
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3312
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3313
     * _.contains([1, 2, 3], 1, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3314
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3315
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3316
     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3317
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3318
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3319
     * _.contains('pebbles', 'eb');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3320
     * // => true
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
    function contains(collection, target, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3323
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3324
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3325
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3326
          result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3327
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3328
      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3329
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3330
        result = indexOf(collection, target, fromIndex) > -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3331
      } else if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3332
        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
  3333
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3334
        baseEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3335
          if (++index >= fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3336
            return !(result = value === target);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3337
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3338
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3339
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3340
      return result;
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
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
     * 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
  3345
     * each element of `collection` through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3346
     * 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
  3347
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3348
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3349
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3350
     * 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
  3351
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3352
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3353
     * 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
  3354
     * 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
  3355
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3356
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3357
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3358
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3359
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3360
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3361
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3362
     *  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
  3363
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3364
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3365
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3366
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3367
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3368
     * _.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
  3369
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3370
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3371
     * _.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
  3372
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3373
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3374
     * _.countBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3375
     * // => { '3': 2, '5': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3376
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3377
    var countBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3378
      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3381
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3382
     * 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
  3383
     * 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
  3384
     * arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3385
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3386
     * 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
  3387
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3388
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3389
     * 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
  3390
     * 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
  3391
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3392
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3393
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3394
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3395
     * @alias all
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3396
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3397
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3398
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3399
     *  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
  3400
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3401
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3402
     * @returns {boolean} Returns `true` if all elements passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3403
     *  else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3404
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3405
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3406
     * _.every([true, 1, null, 'yes']);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3407
     * // => false
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 characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3410
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3411
     *   { 'name': 'fred',   'age': 40 }
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3415
     * _.every(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3416
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3417
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3418
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3419
     * _.every(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3420
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3421
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3422
    function every(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3423
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3424
      callback = lodash.createCallback(callback, thisArg, 3);
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
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3427
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3428
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3429
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3430
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3431
          if (!(result = !!callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3432
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3433
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3434
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3435
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3436
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3437
          return (result = !!callback(value, index, collection));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3438
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3439
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3440
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3441
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3444
     * 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
  3445
     * 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
  3446
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3447
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3448
     * 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
  3449
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3450
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3451
     * 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
  3452
     * 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
  3453
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3454
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3455
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3456
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3457
     * @alias select
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3458
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3459
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3460
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3461
     *  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
  3462
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3463
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3464
     * @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
  3465
     * @example
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
     * 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
  3468
     * // => [2, 4, 6]
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3471
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3472
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3475
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3476
     * _.filter(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3477
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3478
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3479
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3480
     * _.filter(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3481
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3482
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3483
    function filter(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3484
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3485
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3486
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3487
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3488
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3489
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3490
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3491
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3492
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3493
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3494
            result.push(value);
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
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3498
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3499
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3500
            result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3501
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3502
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3503
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3504
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3505
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3506
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3507
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3508
     * Iterates over elements of a collection, returning the first element that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3509
     * 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
  3510
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3511
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3512
     * 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
  3513
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3514
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3515
     * 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
  3516
     * 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
  3517
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3520
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3521
     * @alias detect, findWhere
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3522
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3523
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3524
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3525
     *  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
  3526
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3527
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3528
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3529
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3530
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3531
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3532
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3533
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3534
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3535
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3536
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3537
     * _.find(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3538
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3539
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3540
     * // => { 'name': 'barney', 'age': 36, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3541
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3542
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3543
     * _.find(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3544
     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3545
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3546
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3547
     * _.find(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3548
     * // => { 'name': 'fred', 'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3549
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3550
    function find(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3551
      callback = lodash.createCallback(callback, thisArg, 3);
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
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3554
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3555
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3556
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3557
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3558
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3559
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3560
            return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3561
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3562
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3563
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3564
        var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3565
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3566
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3567
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3568
            return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3569
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3570
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3571
        return result;
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
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3574
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3575
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3576
     * This method is like `_.find` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3577
     * of a `collection` from right to left.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3580
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3581
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3582
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3583
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3584
     *  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
  3585
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3586
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3587
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3588
     * @example
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
     * _.findLast([1, 2, 3, 4], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3591
     *   return num % 2 == 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3592
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3593
     * // => 3
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
    function findLast(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3596
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3597
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3598
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3599
        if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3600
          result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3601
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3602
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3603
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3604
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3605
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3606
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3607
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3608
     * Iterates over elements of a collection, executing the callback for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3609
     * 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
  3610
     * (value, index|key, collection). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3611
     * explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3612
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3613
     * Note: As with other "Collections" methods, objects with a `length` property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3614
     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3615
     * may be used for object iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3616
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3617
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3618
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3619
     * @alias each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3620
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3621
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3622
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3623
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3624
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3625
     * @example
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
     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3628
     * // => logs each number and returns '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3629
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3630
     * _.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
  3631
     * // => 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
  3632
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3633
    function forEach(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3634
      if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3635
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3636
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3637
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3638
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3639
          if (callback(collection[index], index, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3640
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3641
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3642
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3643
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3644
        baseEach(collection, callback, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3645
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3646
      return collection;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3649
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3650
     * This method is like `_.forEach` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3651
     * of a `collection` from right to left.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3654
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3655
     * @alias eachRight
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3656
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3657
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3658
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3659
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3660
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3661
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3662
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3663
     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3664
     * // => 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
  3665
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3666
    function forEachRight(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3667
      var iterable = collection,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3668
          length = collection ? collection.length : 0;
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
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3671
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3672
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3673
          if (callback(collection[length], length, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3674
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3675
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3676
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3677
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3678
        if (typeof length != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3679
          var props = keys(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3680
          length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3681
        } else if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3682
          iterable = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3683
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3684
        baseEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3685
          key = props ? props[--length] : --length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3686
          return callback(iterable[key], key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3687
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3688
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3689
      return collection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3690
    }
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
     * 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
  3694
     * each element of a collection through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3695
     * 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
  3696
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3697
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3698
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3699
     * 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
  3700
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3701
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3702
     * 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
  3703
     * 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
  3704
     * else `false`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3705
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3706
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3707
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3708
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3709
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3710
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3711
     *  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
  3712
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3713
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3714
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3715
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3716
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3717
     * _.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
  3718
     * // => { '4': [4.2], '6': [6.1, 6.4] }
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
     * _.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
  3721
     * // => { '4': [4.2], '6': [6.1, 6.4] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3722
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3723
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3724
     * _.groupBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3725
     * // => { '3': ['one', 'two'], '5': ['three'] }
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 groupBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3728
      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3731
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3732
     * 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
  3733
     * each element of the collection through the given callback. The corresponding
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3734
     * 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
  3735
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3736
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3737
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3738
     * 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
  3739
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3740
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3741
     * 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
  3742
     * 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
  3743
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3744
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3745
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3746
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3747
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3748
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3749
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3750
     *  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
  3751
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3752
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3753
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3754
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3755
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3756
     * var keys = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3757
     *   { 'dir': 'left', 'code': 97 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3758
     *   { 'dir': 'right', 'code': 100 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3759
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3760
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3761
     * _.indexBy(keys, 'dir');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3762
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3763
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3764
     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3765
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3766
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3767
     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3768
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3769
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3770
    var indexBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3771
      result[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3772
    });
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3775
     * 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
  3776
     * 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
  3777
     * 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
  3778
     * 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
  3779
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3780
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3781
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3782
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3783
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3784
     * @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
  3785
     *  the function invoked per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3786
     * @param {...*} [arg] Arguments to invoke the method with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3787
     * @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
  3788
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3789
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3790
     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3791
     * // => [[1, 5, 7], [1, 2, 3]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3792
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3793
     * _.invoke([123, 456], String.prototype.split, '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3794
     * // => [['1', '2', '3'], ['4', '5', '6']]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3795
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3796
    function invoke(collection, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3797
      var args = slice(arguments, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3798
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3799
          isFunc = typeof methodName == 'function',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3800
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3801
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3802
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3803
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3804
        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3807
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3808
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3809
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3810
     * 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
  3811
     * 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
  3812
     * three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3813
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3814
     * 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
  3815
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3816
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3817
     * 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
  3818
     * 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
  3819
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3822
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3823
     * @alias collect
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3824
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3825
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3826
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3827
     *  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
  3828
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3829
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3830
     * @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
  3831
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3832
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3833
     * _.map([1, 2, 3], function(num) { return num * 3; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3834
     * // => [3, 6, 9]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3835
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3836
     * _.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
  3837
     * // => [3, 6, 9] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3838
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3839
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3840
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3841
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3842
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3843
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3844
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3845
     * _.map(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3846
     * // => ['barney', 'fred']
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
    function map(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3849
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3850
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3851
          result = Array(typeof length == 'number' ? length : 0);
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
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3854
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3855
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3856
          result[index] = callback(collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3857
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3858
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3859
        baseEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3860
          result[++index] = callback(value, key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3861
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3862
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3863
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3864
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3865
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
     * 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
  3868
     * 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
  3869
     * 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
  3870
     * 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
  3871
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3872
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3873
     * 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
  3874
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3875
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3876
     * 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
  3877
     * 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
  3878
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3881
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3882
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3883
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3884
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3885
     *  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
  3886
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3887
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3888
     * @returns {*} Returns the maximum value.
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
     * _.max([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3892
     * // => 8
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3895
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3896
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3897
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3898
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3899
     * _.max(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3900
     * // => { 'name': 'fred', 'age': 40 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3901
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3902
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3903
     * _.max(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3904
     * // => { 'name': 'fred', 'age': 40 };
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
    function max(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3907
      var computed = -Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3908
          result = computed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3909
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3910
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3911
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3912
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3913
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3914
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3915
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3916
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3917
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3918
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3919
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3920
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3921
          if (value > result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3922
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3923
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3924
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3925
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3926
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3927
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3928
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3929
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3930
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3931
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3932
          if (current > computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3933
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3934
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3935
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3936
        });
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3939
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3940
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3941
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3942
     * 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
  3943
     * 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
  3944
     * 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
  3945
     * 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
  3946
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3947
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3948
     * 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
  3949
     * callback will return the property value of the given element.
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
     * 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
  3952
     * 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
  3953
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3954
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3955
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3956
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3957
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3958
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3959
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3960
     *  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
  3961
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3962
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3963
     * @returns {*} Returns the minimum value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3964
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3965
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3966
     * _.min([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3967
     * // => 2
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3970
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3971
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3972
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3973
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3974
     * _.min(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3975
     * // => { 'name': 'barney', 'age': 36 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3976
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3977
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3978
     * _.min(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3979
     * // => { 'name': 'barney', 'age': 36 };
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
    function min(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3982
      var computed = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3983
          result = computed;
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
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3986
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3987
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3988
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3989
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3990
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3991
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3992
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3993
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3994
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3995
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3996
          if (value < result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3997
            result = value;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4000
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4001
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4002
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4003
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4004
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4005
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4006
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4007
          if (current < computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4008
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4009
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4010
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4011
        });
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4014
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4015
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
     * 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
  4018
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4019
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4020
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4021
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4022
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4023
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4024
     * @param {string} property The name of the property to pluck.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4025
     * @returns {Array} Returns a new array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4026
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4027
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4028
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4029
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4030
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4031
     * ];
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
     * _.pluck(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4034
     * // => ['barney', 'fred']
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
    var pluck = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4037
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4038
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4039
     * 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
  4040
     * each element in the collection through the callback, where each successive
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4041
     * callback execution consumes the return value of the previous execution. If
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4042
     * `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
  4043
     * 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
  4044
     * and invoked with four arguments; (accumulator, value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4045
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4046
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4047
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4048
     * @alias foldl, inject
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4049
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4050
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4051
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4052
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4053
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4054
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4055
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4056
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4057
     * var sum = _.reduce([1, 2, 3], function(sum, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4058
     *   return sum + num;
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
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4061
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4062
     * 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
  4063
     *   result[key] = num * 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4064
     *   return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4065
     * }, {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4066
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4067
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4068
    function reduce(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4069
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4070
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4071
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4072
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4073
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4074
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4075
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4076
        if (noaccum) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4077
          accumulator = collection[++index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4078
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4079
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4080
          accumulator = callback(accumulator, collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4081
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4082
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4083
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4084
          accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4085
            ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4086
            : callback(accumulator, value, index, collection)
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
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4090
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4093
     * This method is like `_.reduce` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4094
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4095
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4096
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4097
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4098
     * @alias foldr
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4099
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4100
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4101
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4102
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4103
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4104
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4105
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4106
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4107
     * var list = [[0, 1], [2, 3], [4, 5]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4108
     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4109
     * // => [4, 5, 2, 3, 0, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4110
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4111
    function reduceRight(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4112
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4113
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4114
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4115
        accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4116
          ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4117
          : callback(accumulator, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4118
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4119
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4120
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4121
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
     * The opposite of `_.filter` this method returns the elements of a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4124
     * collection that the callback does **not** return truey for.
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
     * 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
  4127
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4128
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4129
     * 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
  4130
     * 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
  4131
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4132
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4133
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4134
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4135
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4136
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4137
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4138
     *  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
  4139
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4140
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4141
     * @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
  4142
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4143
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4144
     * 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
  4145
     * // => [1, 3, 5]
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4148
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4149
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4150
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4151
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4152
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4153
     * _.reject(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4154
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4155
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4156
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4157
     * _.reject(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4158
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4159
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4160
    function reject(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4161
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4162
      return filter(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4163
        return !callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4164
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4165
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4166
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
     * Retrieves a random element or `n` random elements from a collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4169
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4170
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4171
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4172
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4173
     * @param {Array|Object|string} collection The collection to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4174
     * @param {number} [n] The number of elements to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4175
     * @param- {Object} [guard] Allows working with functions like `_.map`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4176
     *  without using their `index` arguments as `n`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4177
     * @returns {Array} Returns the random sample(s) of `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4178
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4179
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4180
     * _.sample([1, 2, 3, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4181
     * // => 2
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
     * _.sample([1, 2, 3, 4], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4184
     * // => [3, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4185
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4186
    function sample(collection, n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4187
      if (collection && typeof collection.length != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4188
        collection = values(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4189
      } else if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4190
        collection = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4191
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4192
      if (n == null || guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4193
        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4194
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4195
      var result = shuffle(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4196
      result.length = nativeMin(nativeMax(0, n), result.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4197
      return result;
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
     * 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
  4202
     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4205
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4206
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4207
     * @param {Array|Object|string} collection The collection to shuffle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4208
     * @returns {Array} Returns a new shuffled collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4209
     * @example
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
     * _.shuffle([1, 2, 3, 4, 5, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4212
     * // => [4, 1, 6, 3, 5, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4213
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4214
    function shuffle(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4215
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4216
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4217
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4218
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4219
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4220
        var rand = baseRandom(0, ++index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4221
        result[index] = result[rand];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4222
        result[rand] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4223
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4224
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4225
    }
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
     * 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
  4229
     * 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
  4230
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4231
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4232
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4233
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4234
     * @param {Array|Object|string} collection The collection to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4235
     * @returns {number} Returns `collection.length` or number of own enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4236
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4237
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4238
     * _.size([1, 2]);
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
     * _.size({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4242
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4243
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4244
     * _.size('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4245
     * // => 7
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4246
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4247
    function size(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4248
      var length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4249
      return typeof length == 'number' ? length : keys(collection).length;
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
     * 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
  4254
     * 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
  4255
     * 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
  4256
     * `thisArg` and invoked with three arguments; (value, index|key, collection).
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 any
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4268
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4269
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4270
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4271
     *  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
  4272
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4273
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4274
     * @returns {boolean} Returns `true` if any element passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4275
     *  else `false`.
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
     * _.some([null, 0, 'yes', false], Boolean);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4279
     * // => true
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4282
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4283
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4284
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4285
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4286
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4287
     * _.some(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4288
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4289
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4290
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4291
     * _.some(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4292
     * // => false
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
    function some(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4295
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4296
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4297
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4298
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4299
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4300
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4301
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4302
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4303
          if ((result = callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4304
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4305
          }
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
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4308
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4309
          return !(result = callback(value, index, collection));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4310
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4311
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4312
      return !!result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4313
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4314
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4315
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4316
     * 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
  4317
     * running each element in a collection through the callback. This method
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4318
     * 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
  4319
     * 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
  4320
     * three arguments; (value, index|key, collection).
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
     * 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
  4323
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4324
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4325
     * 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
  4326
     * will be sorted by each property value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4327
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4328
     * 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
  4329
     * 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
  4330
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4333
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4334
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4335
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4336
     * @param {Array|Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4337
     *  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
  4338
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4339
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4340
     * @returns {Array} Returns a new array of sorted elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4341
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4342
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4343
     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4344
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4345
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4346
     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4347
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4348
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4349
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4350
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4351
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4352
     *   { 'name': 'barney',  'age': 26 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4353
     *   { 'name': 'fred',    'age': 30 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4354
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4355
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4356
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4357
     * _.map(_.sortBy(characters, 'age'), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4358
     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4359
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4360
     * // sorting by multiple properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4361
     * _.map(_.sortBy(characters, ['name', 'age']), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4362
     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4363
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4364
    function sortBy(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4365
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4366
          isArr = isArray(callback),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4367
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4368
          result = Array(typeof length == 'number' ? length : 0);
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 (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4371
        callback = lodash.createCallback(callback, thisArg, 3);
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
      forEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4374
        var object = result[++index] = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4375
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4376
          object.criteria = map(callback, function(key) { return value[key]; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4377
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4378
          (object.criteria = getArray())[0] = callback(value, key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4379
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4380
        object.index = index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4381
        object.value = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4382
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4383
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4384
      length = result.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4385
      result.sort(compareAscending);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4386
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4387
        var object = result[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4388
        result[length] = object.value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4389
        if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4390
          releaseArray(object.criteria);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4391
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4392
        releaseObject(object);
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4395
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4398
     * Converts the `collection` to an array.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4401
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4402
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4403
     * @param {Array|Object|string} collection The collection to convert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4404
     * @returns {Array} Returns the new converted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4405
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4406
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4407
     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4408
     * // => [2, 3, 4]
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
    function toArray(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4411
      if (collection && typeof collection.length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4412
        return (support.unindexedChars && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4413
          ? collection.split('')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4414
          : slice(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4415
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4416
      return values(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4417
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4418
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
     * 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
  4421
     * `properties` object, returning an array of all elements that have equivalent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4422
     * property values.
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
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4427
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4428
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4429
     * @param {Object} props The object of property values to filter by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4430
     * @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
  4431
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4432
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4433
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4434
     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4435
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4436
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4437
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4438
     * _.where(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4439
     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4440
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4441
     * _.where(characters, { 'pets': ['dino'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4442
     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4443
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4444
    var where = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4445
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4448
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4449
     * 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
  4450
     * `0`, `""`, `undefined`, and `NaN` are all falsey.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4453
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4454
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4455
     * @param {Array} array The array to compact.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4456
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4457
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4458
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4459
     * _.compact([0, 1, false, 2, '', 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4460
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4461
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4462
    function compact(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4463
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4464
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4465
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4466
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4467
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4468
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4469
        if (value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4470
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4471
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4472
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4473
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4474
    }
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
     * 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
  4478
     * equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4479
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4480
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4481
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4482
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4483
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4484
     * @param {...Array} [values] The arrays of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4485
     * @returns {Array} Returns a new array of filtered 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
     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4489
     * // => [1, 3, 4]
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 difference(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4492
      return baseDifference(array, baseFlatten(arguments, true, true, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4493
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4494
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4495
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4496
     * 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
  4497
     * element that passes the callback check, instead of the element itself.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4498
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4499
     * 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
  4500
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4501
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4502
     * 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
  4503
     * 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
  4504
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4505
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4506
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4507
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4508
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4509
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4510
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4511
     *  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
  4512
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4513
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4514
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4515
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4516
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4517
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4518
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4519
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4520
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4521
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4522
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4523
     * _.findIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4524
     *   return chr.age < 20;
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
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4527
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4528
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4529
     * _.findIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4530
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4531
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4532
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4533
     * _.findIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4534
     * // => 1
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
    function findIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4537
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4538
          length = array ? array.length : 0;
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
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4541
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4542
        if (callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4543
          return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4544
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4545
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4546
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4547
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4548
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
     * This method is like `_.findIndex` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4551
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4552
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4553
     * 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
  4554
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4555
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4556
     * 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
  4557
     * 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
  4558
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4559
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4560
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4561
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4562
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4563
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4564
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4565
     *  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
  4566
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4567
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4568
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4569
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4570
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4571
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4572
     *   { 'name': 'barney',  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4573
     *   { 'name': 'fred',    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4574
     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4575
     * ];
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
     * _.findLastIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4578
     *   return chr.age > 30;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4579
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4580
     * // => 1
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
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4583
     * _.findLastIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4584
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4585
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4586
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4587
     * _.findLastIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4588
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4589
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4590
    function findLastIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4591
      var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4592
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4593
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4594
        if (callback(array[length], length, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4595
          return length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4596
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4597
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4598
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4599
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4602
     * 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
  4603
     * 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
  4604
     * 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
  4605
     * invoked with three arguments; (value, index, array).
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
     * 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
  4608
     * callback will return the property value of the given element.
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
     * 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
  4611
     * 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
  4612
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4613
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4614
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4615
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4616
     * @alias head, take
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4617
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4618
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4619
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4620
     *  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
  4621
     *  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
  4622
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4623
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4624
     * @returns {*} Returns the first element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4625
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4626
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4627
     * _.first([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4628
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4629
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4630
     * _.first([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4631
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4632
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4633
     * _.first([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4634
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4635
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4636
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4637
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4638
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4639
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4640
     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4641
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4642
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4643
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4644
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4645
     * _.first(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4646
     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4647
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4648
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4649
     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4650
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4651
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4652
    function first(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4653
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4654
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4655
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4656
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4657
        var index = -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4658
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4659
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4660
          n++;
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
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4663
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4664
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4665
          return array ? array[0] : undefined;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4668
      return slice(array, 0, nativeMin(nativeMax(0, n), length));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4669
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4670
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4671
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4672
     * 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
  4673
     * 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
  4674
     * 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
  4675
     * flattening. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4676
     * arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4677
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4678
     * 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
  4679
     * callback will return the property value of the given element.
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
     * 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
  4682
     * 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
  4683
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4686
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4687
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4688
     * @param {Array} array The array to flatten.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4689
     * @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
  4690
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4691
     *  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
  4692
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4693
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4694
     * @returns {Array} Returns a new flattened array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4695
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4696
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4697
     * _.flatten([1, [2], [3, [[4]]]]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4698
     * // => [1, 2, 3, 4];
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
     * _.flatten([1, [2], [3, [[4]]]], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4701
     * // => [1, 2, 3, [[4]]];
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4704
     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4705
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4706
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4707
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4708
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4709
     * _.flatten(characters, 'pets');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4710
     * // => ['hoppy', 'baby puss', 'dino']
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
    function flatten(array, isShallow, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4713
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4714
      if (typeof isShallow != 'boolean' && isShallow != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4715
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4716
        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4717
        isShallow = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4718
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4719
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4720
        array = map(array, callback, thisArg);
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
      return baseFlatten(array, isShallow);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4723
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4724
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
     * 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
  4727
     * 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
  4728
     * providing `true` for `fromIndex` will run a faster binary search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4729
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4730
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4731
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4732
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4733
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4734
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4735
     * @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
  4736
     *  to perform a binary search on a sorted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4737
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4738
     * @example
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
     * _.indexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4741
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4742
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4743
     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4744
     * // => 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4745
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4746
     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4747
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4748
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4749
    function indexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4750
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4751
        var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4752
        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4753
      } else if (fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4754
        var index = sortedIndex(array, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4755
        return array[index] === value ? index : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4756
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4757
      return baseIndexOf(array, value, fromIndex);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4758
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4759
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4760
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4761
     * 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
  4762
     * 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
  4763
     * 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
  4764
     * to `thisArg` and invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4765
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4766
     * 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
  4767
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4768
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4769
     * 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
  4770
     * 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
  4771
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4772
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4773
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4774
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4775
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4776
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4777
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4778
     *  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
  4779
     *  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
  4780
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4781
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4782
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4783
     * @example
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
     * _.initial([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4786
     * // => [1, 2]
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
     * _.initial([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4789
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4790
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4791
     * _.initial([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4792
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4793
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4794
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4795
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4796
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4797
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4798
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4799
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4800
     * ];
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4803
     * _.initial(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4804
     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4805
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4806
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4807
     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4808
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4809
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4810
    function initial(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4811
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4812
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4813
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4814
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4815
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4816
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4817
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4818
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4819
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4820
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4821
        n = (callback == null || thisArg) ? 1 : callback || n;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4822
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4823
      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4824
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4827
     * 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
  4828
     * strict equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4829
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4830
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4831
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4832
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4833
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4834
     * @returns {Array} Returns an array of shared values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4835
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4836
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4837
     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4838
     * // => [1, 2]
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 intersection() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4841
      var args = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4842
          argsIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4843
          argsLength = arguments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4844
          caches = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4845
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4846
          trustIndexOf = indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4847
          seen = getArray();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4848
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4849
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4850
        var value = arguments[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4851
        if (isArray(value) || isArguments(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4852
          args.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4853
          caches.push(trustIndexOf && value.length >= largeArraySize &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4854
            createCache(argsIndex ? args[argsIndex] : seen));
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
      var array = args[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4858
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4859
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4860
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4861
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4862
      outer:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4863
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4864
        var cache = caches[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4865
        value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4866
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4867
        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4868
          argsIndex = argsLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4869
          (cache || seen).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4870
          while (--argsIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4871
            cache = caches[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4872
            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4873
              continue outer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4874
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4875
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4876
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4877
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4878
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4879
      while (argsLength--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4880
        cache = caches[argsLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4881
        if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4882
          releaseObject(cache);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4883
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4884
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4885
      releaseArray(caches);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4886
      releaseArray(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4887
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4888
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4891
     * 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
  4892
     * 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
  4893
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4894
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4895
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4896
     * 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
  4897
     * callback will return the property value of the given element.
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
     * 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
  4900
     * 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
  4901
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4902
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4903
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4904
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4905
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4906
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4907
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4908
     *  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
  4909
     *  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
  4910
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4911
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4912
     * @returns {*} Returns the last element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4913
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4914
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4915
     * _.last([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4916
     * // => 3
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
     * _.last([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4919
     * // => [2, 3]
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
     * _.last([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4922
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4923
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4924
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4925
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4926
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4927
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4928
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4929
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4930
     * ];
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4933
     * _.pluck(_.last(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4934
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4935
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4936
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4937
     * _.last(characters, { 'employer': 'na' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4938
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
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
    function last(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4941
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4942
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4943
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4944
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4945
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4946
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4947
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4948
          n++;
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
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4951
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4952
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4953
          return array ? array[length - 1] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4954
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4955
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4956
      return slice(array, nativeMax(0, length - n));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4957
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4958
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4959
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4960
     * 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
  4961
     * 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
  4962
     * as the offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4963
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4964
     * 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
  4965
     * callback will return the property value of the given element.
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
     * 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
  4968
     * 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
  4969
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4970
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4971
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4972
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4973
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4974
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4975
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4976
     * @param {number} [fromIndex=array.length-1] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4977
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4978
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4979
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4980
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4981
     * // => 4
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
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4984
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4985
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4986
    function lastIndexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4987
      var index = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4988
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4989
        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
  4990
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4991
      while (index--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4992
        if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4993
          return index;
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
      return -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4997
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4998
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
     * 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
  5001
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5002
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5003
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5004
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5005
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5006
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5007
     * @param {...*} [value] The values to remove.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5008
     * @returns {Array} Returns `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5009
     * @example
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
     * var array = [1, 2, 3, 1, 2, 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5012
     * _.pull(array, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5013
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5014
     * // => [1, 1]
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
    function pull(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5017
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5018
          argsIndex = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5019
          argsLength = args.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5020
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5021
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5022
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5023
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5024
            value = args[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5025
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5026
          if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5027
            splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5028
            length--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5029
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5030
        }
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
      return array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5033
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5034
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
     * Creates an array of numbers (positive and/or negative) progressing from
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5037
     * `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
  5038
     * zero-length range is created unless a negative `step` is specified.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5039
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5040
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5041
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5042
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5043
     * @param {number} [start=0] The start of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5044
     * @param {number} end The end of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5045
     * @param {number} [step=1] The value to increment or decrement by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5046
     * @returns {Array} Returns a new range array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5047
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5048
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5049
     * _.range(4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5050
     * // => [0, 1, 2, 3]
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
     * _.range(1, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5053
     * // => [1, 2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5054
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5055
     * _.range(0, 20, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5056
     * // => [0, 5, 10, 15]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5057
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5058
     * _.range(0, -4, -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5059
     * // => [0, -1, -2, -3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5060
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5061
     * _.range(1, 4, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5062
     * // => [1, 1, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5063
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5064
     * _.range(0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5065
     * // => []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5066
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5067
    function range(start, end, step) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5068
      start = +start || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5069
      step = typeof step == 'number' ? step : (+step || 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5070
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5071
      if (end == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5072
        end = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5073
        start = 0;
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
      // 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
  5076
      // http://youtu.be/XAqIpGU8ZZk#t=17m25s
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5077
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5078
          length = nativeMax(0, ceil((end - start) / (step || 1))),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5079
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5080
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5081
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5082
        result[index] = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5083
        start += step;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5084
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5085
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5086
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5087
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5088
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5089
     * 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
  5090
     * 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
  5091
     * and invoked with three arguments; (value, index, array).
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
     * 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
  5094
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5095
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5096
     * 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
  5097
     * 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
  5098
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5099
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5100
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5101
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5102
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5103
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5104
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5105
     *  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
  5106
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5107
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5108
     * @returns {Array} Returns a new array of removed elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5109
     * @example
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
     * var array = [1, 2, 3, 4, 5, 6];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5112
     * var evens = _.remove(array, function(num) { return num % 2 == 0; });
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
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5115
     * // => [1, 3, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5116
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5117
     * console.log(evens);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5118
     * // => [2, 4, 6]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5119
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5120
    function remove(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5121
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5122
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5123
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5124
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5125
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5126
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5127
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5128
        if (callback(value, index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5129
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5130
          splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5131
          length--;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5134
      return result;
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
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
     * 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
  5139
     * 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
  5140
     * 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
  5141
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5142
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5143
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5144
     * 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
  5145
     * callback will return the property value of the given element.
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
     * 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
  5148
     * 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
  5149
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5150
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5151
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5152
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5153
     * @alias drop, tail
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5154
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5155
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5156
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5157
     *  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
  5158
     *  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
  5159
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5160
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5161
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5162
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5163
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5164
     * _.rest([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5165
     * // => [2, 3]
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
     * _.rest([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5168
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5169
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5170
     * _.rest([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5171
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5172
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5173
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5174
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5175
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5176
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5177
     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5178
     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5179
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5180
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5181
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5182
     * _.pluck(_.rest(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5183
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5184
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5185
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5186
     * _.rest(characters, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5187
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5188
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5189
    function rest(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5190
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5191
        var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5192
            index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5193
            length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5194
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5195
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5196
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5197
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5198
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5199
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5200
        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5201
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5202
      return slice(array, n);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5203
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5204
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
     * 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
  5207
     * 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
  5208
     * 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
  5209
     * `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
  5210
     * callback is bound to `thisArg` and invoked with one argument; (value).
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
     * 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
  5213
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5214
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5215
     * 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
  5216
     * 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
  5217
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5218
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5219
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5220
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5221
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5222
     * @param {Array} array The array to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5223
     * @param {*} value The value to evaluate.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5224
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5225
     *  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
  5226
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5227
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5228
     * @returns {number} Returns the index at which `value` should be inserted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5229
     *  into `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5230
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5231
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5232
     * _.sortedIndex([20, 30, 50], 40);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5233
     * // => 2
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5236
     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5237
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5238
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5239
     * var dict = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5240
     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5241
     * };
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
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5244
     *   return dict.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5245
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5246
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5247
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5248
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5249
     *   return this.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5250
     * }, dict);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5251
     * // => 2
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
    function sortedIndex(array, value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5254
      var low = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5255
          high = array ? array.length : low;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5256
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5257
      // explicitly reference `identity` for better inlining in Firefox
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5258
      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5259
      value = callback(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5260
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5261
      while (low < high) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5262
        var mid = (low + high) >>> 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5263
        (callback(array[mid]) < value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5264
          ? low = mid + 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5265
          : high = mid;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5266
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5267
      return low;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5271
     * 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
  5272
     * strict equality for comparisons, i.e. `===`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5275
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5276
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5277
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5278
     * @returns {Array} Returns an array of combined values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5279
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5280
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5281
     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5282
     * // => [1, 2, 3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5283
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5284
    function union() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5285
      return baseUniq(baseFlatten(arguments, true, true));
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5288
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5289
     * 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
  5290
     * for comparisons, i.e. `===`. If the array is sorted, providing
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5291
     * `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
  5292
     * each element of `array` is passed through the callback before uniqueness
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5293
     * 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
  5294
     * arguments; (value, index, array).
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
     * 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
  5297
     * callback will return the property value of the given element.
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
     * 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
  5300
     * 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
  5301
     * else `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5304
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5305
     * @alias unique
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5306
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5307
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5308
     * @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
  5309
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5310
     *  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
  5311
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5312
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5313
     * @returns {Array} Returns a duplicate-value-free array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5314
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5315
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5316
     * _.uniq([1, 2, 1, 3, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5317
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5318
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5319
     * _.uniq([1, 1, 2, 2, 3], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5320
     * // => [1, 2, 3]
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
     * _.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
  5323
     * // => ['A', 'b', 'C']
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
     * _.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
  5326
     * // => [1, 2.5, 3]
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
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5329
     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5330
     * // => [{ 'x': 1 }, { 'x': 2 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5331
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5332
    function uniq(array, isSorted, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5333
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5334
      if (typeof isSorted != 'boolean' && isSorted != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5335
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5336
        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5337
        isSorted = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5338
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5339
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5340
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5341
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5342
      return baseUniq(array, isSorted, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5343
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5344
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5345
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5346
     * Creates an array excluding all provided values using strict equality for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5347
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5348
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5349
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5350
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5351
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5352
     * @param {Array} array The array to filter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5353
     * @param {...*} [value] The values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5354
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5355
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5356
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5357
     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5358
     * // => [2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5359
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5360
    function without(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5361
      return baseDifference(array, slice(arguments, 1));
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5364
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5365
     * 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
  5366
     * See http://en.wikipedia.org/wiki/Symmetric_difference.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5369
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5370
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5371
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5372
     * @returns {Array} Returns an array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5373
     * @example
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
     * _.xor([1, 2, 3], [5, 2, 1, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5376
     * // => [3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5377
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5378
     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5379
     * // => [1, 4, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5380
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5381
    function xor() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5382
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5383
          length = arguments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5384
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5385
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5386
        var array = arguments[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5387
        if (isArray(array) || isArguments(array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5388
          var result = result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5389
            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5390
            : array;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5391
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5392
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5393
      return result || [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5394
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5395
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5396
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5397
     * 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
  5398
     * 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
  5399
     * elements of the given arrays, and so on.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5400
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5401
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5402
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5403
     * @alias unzip
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5404
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5405
     * @param {...Array} [array] Arrays to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5406
     * @returns {Array} Returns a new array of grouped elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5407
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5408
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5409
     * _.zip(['fred', 'barney'], [30, 40], [true, false]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5410
     * // => [['fred', 30, true], ['barney', 40, false]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5411
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5412
    function zip() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5413
      var array = arguments.length > 1 ? arguments : arguments[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5414
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5415
          length = array ? max(pluck(array, 'length')) : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5416
          result = Array(length < 0 ? 0 : length);
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
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5419
        result[index] = pluck(array, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5420
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5421
      return result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5424
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5425
     * Creates an object composed from arrays of `keys` and `values`. Provide
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5426
     * 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
  5427
     * or two arrays, one of `keys` and one of corresponding `values`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5428
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5429
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5430
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5431
     * @alias object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5432
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5433
     * @param {Array} keys The array of keys.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5434
     * @param {Array} [values=[]] The array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5435
     * @returns {Object} Returns an object composed of the given keys and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5436
     *  corresponding values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5437
     * @example
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
     * _.zipObject(['fred', 'barney'], [30, 40]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5440
     * // => { 'fred': 30, 'barney': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5441
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5442
    function zipObject(keys, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5443
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5444
          length = keys ? keys.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5445
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5446
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5447
      if (!values && length && !isArray(keys[0])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5448
        values = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5449
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5450
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5451
        var key = keys[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5452
        if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5453
          result[key] = values[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5454
        } else if (key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5455
          result[key[0]] = key[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5456
        }
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
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5459
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5460
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5463
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5464
     * Creates a function that executes `func`, with  the `this` binding and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5465
     * arguments of the created function, only after being called `n` times.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5466
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5467
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5468
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5469
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5470
     * @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
  5471
     *  `func` is executed.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5472
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5473
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5474
     * @example
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
     * var saves = ['profile', 'settings'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5477
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5478
     * var done = _.after(saves.length, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5479
     *   console.log('Done saving!');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5480
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5481
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5482
     * _.forEach(saves, function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5483
     *   asyncSave({ 'type': type, 'complete': done });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5484
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5485
     * // => logs 'Done saving!', after all saves have completed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5486
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5487
    function after(n, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5488
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5489
        throw new TypeError;
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
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5492
        if (--n < 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5493
          return func.apply(this, arguments);
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
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5496
    }
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
     * Creates a function that, when called, invokes `func` with the `this`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5500
     * binding of `thisArg` and prepends any additional `bind` arguments to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5501
     * provided to the bound function.
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 bind.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5507
     * @param {*} [thisArg] The `this` binding of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5508
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5509
     * @returns {Function} Returns the new bound function.
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
     * var func = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5513
     *   return greeting + ' ' + this.name;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5516
     * func = _.bind(func, { 'name': 'fred' }, 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5517
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5518
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5519
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5520
    function bind(func, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5521
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5522
        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5523
        : createWrapper(func, 1, null, null, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5524
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5525
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5526
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5527
     * 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
  5528
     * 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
  5529
     * 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
  5530
     * of `object` will be bound.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5531
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5532
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5533
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5534
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5535
     * @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
  5536
     * @param {...string} [methodName] The object method names to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5537
     *  bind, specified as individual method names or arrays of method names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5538
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5539
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5540
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5541
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5542
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5543
     *   'onClick': function() { console.log('clicked ' + this.label); }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5544
     * };
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
     * _.bindAll(view);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5547
     * jQuery('#docs').on('click', view.onClick);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5548
     * // => logs 'clicked docs', when the button is clicked
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
    function bindAll(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5551
      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
  5552
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5553
          length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5554
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5555
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5556
        var key = funcs[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5557
        object[key] = createWrapper(object[key], 1, null, null, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5558
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5559
      return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5560
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5561
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5562
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5563
     * 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
  5564
     * 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
  5565
     * function. This method differs from `_.bind` by allowing bound functions to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5566
     * reference methods that will be redefined or don't yet exist.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5567
     * See http://michaux.ca/articles/lazy-function-definition-pattern.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5568
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5569
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5570
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5571
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5572
     * @param {Object} object The object the method belongs to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5573
     * @param {string} key The key of the method.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5574
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5575
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5576
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5577
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5578
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5579
     *   'name': 'fred',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5580
     *   'greet': function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5581
     *     return greeting + ' ' + this.name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5582
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5583
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5584
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5585
     * var func = _.bindKey(object, 'greet', 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5586
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5587
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5588
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5589
     * object.greet = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5590
     *   return greeting + 'ya ' + this.name + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5591
     * };
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
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5594
     * // => 'hiya fred!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5595
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5596
    function bindKey(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5597
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5598
        ? createWrapper(key, 19, slice(arguments, 2), null, object)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5599
        : createWrapper(key, 3, null, null, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5600
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5601
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5602
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5603
     * Creates a function that is the composition of the provided functions,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5604
     * 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
  5605
     * 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
  5606
     * 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
  5607
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5608
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5609
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5610
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5611
     * @param {...Function} [func] Functions to compose.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5612
     * @returns {Function} Returns the new composed function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5613
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5614
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5615
     * var realNameMap = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5616
     *   'pebbles': 'penelope'
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5619
     * var format = function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5620
     *   name = realNameMap[name.toLowerCase()] || name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5621
     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5622
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5623
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5624
     * var greet = function(formatted) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5625
     *   return 'Hiya ' + formatted + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5626
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5627
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5628
     * var welcome = _.compose(greet, format);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5629
     * welcome('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5630
     * // => 'Hiya Penelope!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5631
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5632
    function compose() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5633
      var funcs = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5634
          length = funcs.length;
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
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5637
        if (!isFunction(funcs[length])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5638
          throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5639
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5640
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5641
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5642
        var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5643
            length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5644
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5645
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5646
          args = [funcs[length].apply(this, args)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5647
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5648
        return args[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5649
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5650
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5651
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
     * 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
  5654
     * invoked either executes `func` returning its result, if all `func` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5655
     * 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
  5656
     * 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
  5657
     * if `func.length` is not sufficient.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5660
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5661
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5662
     * @param {Function} func The function to curry.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5663
     * @param {number} [arity=func.length] The arity of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5664
     * @returns {Function} Returns the new curried function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5665
     * @example
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
     * var curried = _.curry(function(a, b, c) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5668
     *   console.log(a + b + c);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5669
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5670
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5671
     * curried(1)(2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5672
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5673
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5674
     * curried(1, 2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5675
     * // => 6
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
     * curried(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5678
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5679
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5680
    function curry(func, arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5681
      arity = typeof arity == 'number' ? arity : (+arity || func.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5682
      return createWrapper(func, 4, null, null, null, arity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5683
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5684
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5685
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5686
     * 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
  5687
     * `wait` milliseconds have elapsed since the last time it was invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5688
     * 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
  5689
     * 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
  5690
     * 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
  5691
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5692
     * 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
  5693
     * 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
  5694
     * invoked more than once during the `wait` timeout.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5697
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5698
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5699
     * @param {Function} func The function to debounce.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5700
     * @param {number} wait The number of milliseconds to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5701
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5702
     * @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
  5703
     * @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
  5704
     * @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
  5705
     * @returns {Function} Returns the new debounced function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5706
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5707
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5708
     * // avoid costly calculations while the window size is in flux
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5709
     * var lazyLayout = _.debounce(calculateLayout, 150);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5710
     * jQuery(window).on('resize', lazyLayout);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5711
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5712
     * // execute `sendMail` when the click event is fired, debouncing subsequent calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5713
     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5714
     *   'leading': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5715
     *   'trailing': false
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
     * // ensure `batchLog` is executed once after 1 second of debounced calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5719
     * var source = new EventSource('/stream');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5720
     * source.addEventListener('message', _.debounce(batchLog, 250, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5721
     *   'maxWait': 1000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5722
     * }, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5723
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5724
    function debounce(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5725
      var args,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5726
          maxTimeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5727
          result,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5728
          stamp,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5729
          thisArg,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5730
          timeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5731
          trailingCall,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5732
          lastCalled = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5733
          maxWait = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5734
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5735
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5736
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5737
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5738
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5739
      wait = nativeMax(0, wait) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5740
      if (options === true) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5741
        var leading = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5742
        trailing = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5743
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5744
        leading = options.leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5745
        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5746
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5747
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5748
      var delayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5749
        var remaining = wait - (now() - stamp);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5750
        if (remaining <= 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5751
          if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5752
            clearTimeout(maxTimeoutId);
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 isCalled = trailingCall;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5755
          maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5756
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5757
            lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5758
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5759
            if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5760
              args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5761
            }
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
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5764
          timeoutId = setTimeout(delayed, remaining);
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
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5767
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5768
      var maxDelayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5769
        if (timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5770
          clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5771
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5772
        maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5773
        if (trailing || (maxWait !== wait)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5774
          lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5775
          result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5776
          if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5777
            args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5778
          }
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
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5781
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5782
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5783
        args = arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5784
        stamp = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5785
        thisArg = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5786
        trailingCall = trailing && (timeoutId || !leading);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5787
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5788
        if (maxWait === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5789
          var leadingCall = leading && !timeoutId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5790
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5791
          if (!maxTimeoutId && !leading) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5792
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5793
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5794
          var remaining = maxWait - (stamp - lastCalled),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5795
              isCalled = remaining <= 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5796
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5797
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5798
            if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5799
              maxTimeoutId = clearTimeout(maxTimeoutId);
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
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5802
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5803
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5804
          else if (!maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5805
            maxTimeoutId = setTimeout(maxDelayed, remaining);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5806
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5807
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5808
        if (isCalled && timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5809
          timeoutId = clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5810
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5811
        else if (!timeoutId && wait !== maxWait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5812
          timeoutId = setTimeout(delayed, wait);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5813
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5814
        if (leadingCall) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5815
          isCalled = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5816
          result = func.apply(thisArg, args);
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
        if (isCalled && !timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5819
          args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5820
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5821
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5822
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5823
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5824
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
     * 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
  5827
     * Additional arguments will be provided to `func` when it is invoked.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5830
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5831
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5832
     * @param {Function} func The function to defer.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5833
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5834
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5835
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5836
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5837
     * _.defer(function(text) { console.log(text); }, 'deferred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5838
     * // logs 'deferred' after one or more milliseconds
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5839
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5840
    function defer(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5841
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5842
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5843
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5844
      var args = slice(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5845
      return setTimeout(function() { func.apply(undefined, args); }, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5846
    }
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
     * Executes the `func` function after `wait` milliseconds. Additional arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5850
     * will be provided to `func` when it is invoked.
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 Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5855
     * @param {Function} func The function to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5856
     * @param {number} wait The number of milliseconds to delay execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5857
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5858
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5859
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5860
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5861
     * _.delay(function(text) { console.log(text); }, 1000, 'later');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5862
     * // => logs 'later' after one second
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5863
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5864
    function delay(func, wait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5865
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5866
        throw new TypeError;
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
      var args = slice(arguments, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5869
      return setTimeout(function() { func.apply(undefined, args); }, wait);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5872
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5873
     * 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
  5874
     * 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
  5875
     * 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
  5876
     * 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
  5877
     * 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
  5878
     * 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
  5879
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5880
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5881
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5882
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5883
     * @param {Function} func The function to have its output memoized.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5884
     * @param {Function} [resolver] A function used to resolve the cache key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5885
     * @returns {Function} Returns the new memoizing function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5886
     * @example
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
     * var fibonacci = _.memoize(function(n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5889
     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5892
     * fibonacci(9)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5893
     * // => 34
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
     * var data = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5896
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5897
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5900
     * // modifying the result cache
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5901
     * var get = _.memoize(function(name) { return data[name]; }, _.identity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5902
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5903
     * // => { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5904
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5905
     * get.cache.pebbles.name = 'penelope';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5906
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5907
     * // => { 'name': 'penelope', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5908
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5909
    function memoize(func, resolver) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5910
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5911
        throw new TypeError;
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 memoized = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5914
        var cache = memoized.cache,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5915
            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5916
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5917
        return hasOwnProperty.call(cache, key)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5918
          ? cache[key]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5919
          : (cache[key] = func.apply(this, arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5920
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5921
      memoized.cache = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5922
      return memoized;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5925
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5926
     * 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
  5927
     * 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
  5928
     * with the `this` binding of the created function.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5931
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5932
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5933
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5934
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5935
     * @example
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
     * var initialize = _.once(createApplication);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5938
     * initialize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5939
     * initialize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5940
     * // `initialize` executes `createApplication` once
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5941
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5942
    function once(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5943
      var ran,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5944
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5945
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5946
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5947
        throw new TypeError;
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
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5950
        if (ran) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5951
          return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5952
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5953
        ran = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5954
        result = func.apply(this, arguments);
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
        // clear the `func` variable so the function may be garbage collected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5957
        func = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5958
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5959
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5960
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5961
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5962
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5963
     * Creates a function that, when called, invokes `func` with any additional
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5964
     * `partial` arguments prepended to those provided to the new function. This
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5965
     * 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
  5966
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5967
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5968
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5969
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5970
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5971
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5972
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5973
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5974
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5975
     * var greet = function(greeting, name) { return greeting + ' ' + name; };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5976
     * var hi = _.partial(greet, 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5977
     * hi('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5978
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5979
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5980
    function partial(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5981
      return createWrapper(func, 16, slice(arguments, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5982
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5983
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
     * This method is like `_.partial` except that `partial` arguments are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5986
     * appended to those provided to the new function.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5989
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5990
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5991
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5992
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5993
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5994
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5995
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5996
     * var defaultsDeep = _.partialRight(_.merge, _.defaults);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5997
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5998
     * var options = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5999
     *   'variable': 'data',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6000
     *   'imports': { 'jq': $ }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6001
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6002
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6003
     * defaultsDeep(options, _.templateSettings);
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
     * options.variable
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6006
     * // => 'data'
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
     * options.imports
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6009
     * // => { '_': _, 'jq': $ }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6010
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6011
    function partialRight(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6012
      return createWrapper(func, 32, null, slice(arguments, 1));
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6015
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6016
     * 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
  6017
     * 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
  6018
     * 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
  6019
     * of the `wait` timeout. Subsequent calls to the throttled function will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6020
     * return the result of the last `func` call.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6021
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6022
     * 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
  6023
     * 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
  6024
     * invoked more than once during the `wait` timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6025
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6026
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6027
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6028
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6029
     * @param {Function} func The function to throttle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6030
     * @param {number} wait The number of milliseconds to throttle executions to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6031
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6032
     * @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
  6033
     * @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
  6034
     * @returns {Function} Returns the new throttled function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6035
     * @example
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
     * // avoid excessively updating the position while scrolling
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6038
     * var throttled = _.throttle(updatePosition, 100);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6039
     * jQuery(window).on('scroll', throttled);
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
     * // 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
  6042
     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6043
     *   'trailing': false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6044
     * }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6045
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6046
    function throttle(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6047
      var leading = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6048
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6049
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6050
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6051
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6052
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6053
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6054
        leading = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6055
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6056
        leading = 'leading' in options ? options.leading : leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6057
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6058
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6059
      debounceOptions.leading = leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6060
      debounceOptions.maxWait = wait;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6061
      debounceOptions.trailing = trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6062
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6063
      return debounce(func, wait, debounceOptions);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6064
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6065
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
     * 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
  6068
     * first argument. Additional arguments provided to the function are appended
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6069
     * 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
  6070
     * the `this` binding of the created function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6071
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6072
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6073
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6074
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6075
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6076
     * @param {Function} wrapper The wrapper function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6077
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6078
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6079
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6080
     * var p = _.wrap(_.escape, function(func, text) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6081
     *   return '<p>' + func(text) + '</p>';
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
     * p('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6085
     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'
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
    function wrap(value, wrapper) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6088
      return createWrapper(wrapper, 16, [value]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6089
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6090
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6091
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6092
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
     * Creates a function that returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6095
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6096
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6097
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6098
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6099
     * @param {*} value The value to return from the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6100
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6101
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6102
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6103
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6104
     * var getter = _.constant(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6105
     * getter() === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6106
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6107
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6108
    function constant(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6109
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6110
        return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6111
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6112
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6113
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
     * 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
  6116
     * 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
  6117
     * 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
  6118
     * that contain the equivalent object properties, otherwise it will return `false`.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6121
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6122
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6123
     * @param {*} [func=identity] The value to convert to a callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6124
     * @param {*} [thisArg] The `this` binding of the created callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6125
     * @param {number} [argCount] The number of arguments the callback accepts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6126
     * @returns {Function} Returns a callback function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6127
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6128
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6129
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6130
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6131
     *   { 'name': 'fred',   'age': 40 }
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
     * // wrap to create custom callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6135
     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6136
     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6137
     *   return !match ? func(callback, thisArg) : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6138
     *     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
  6139
     *   };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6140
     * });
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
     * _.filter(characters, 'age__gt38');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6143
     * // => [{ 'name': 'fred', 'age': 40 }]
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
    function createCallback(func, thisArg, argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6146
      var type = typeof func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6147
      if (func == null || type == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6148
        return baseCreateCallback(func, thisArg, argCount);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6149
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6150
      // handle "_.pluck" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6151
      if (type != 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6152
        return property(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6153
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6154
      var props = keys(func),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6155
          key = props[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6156
          a = func[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6157
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6158
      // handle "_.where" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6159
      if (props.length == 1 && a === a && !isObject(a)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6160
        // 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
  6161
        // property containing a primitive value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6162
        return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6163
          var b = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6164
          return a === b && (a !== 0 || (1 / a == 1 / b));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6165
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6166
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6167
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6168
        var length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6169
            result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6171
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6172
          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6173
            break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6174
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6175
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6176
        return result;
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
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6179
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6180
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6181
     * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6182
     * corresponding HTML entities.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6183
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6184
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6185
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6186
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6187
     * @param {string} string The string to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6188
     * @returns {string} Returns the escaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6189
     * @example
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
     * _.escape('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6192
     * // => 'Fred, Wilma, &amp; Pebbles'
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
    function escape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6195
      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6196
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6197
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
     * This method returns the first argument provided to it.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6200
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6201
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6202
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6203
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6204
     * @param {*} value Any value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6205
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6206
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6207
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6208
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6209
     * _.identity(object) === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6210
     * // => true
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
    function identity(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6213
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6214
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6215
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6216
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6217
     * Adds function properties of a source object to the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6218
     * 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
  6219
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6220
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6221
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6222
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6223
     * @param {Function|Object} [object=lodash] object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6224
     * @param {Object} source The object of functions to add.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6225
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6226
     * @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
  6227
     * @example
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
     * function capitalize(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6230
     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6233
     * _.mixin({ 'capitalize': capitalize });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6234
     * _.capitalize('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6235
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6236
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6237
     * _('fred').capitalize().value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6238
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6239
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6240
     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6241
     * _('fred').capitalize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6242
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6243
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6244
    function mixin(object, source, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6245
      var chain = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6246
          methodNames = source && functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6248
      if (!source || (!options && !methodNames.length)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6249
        if (options == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6250
          options = source;
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
        ctor = lodashWrapper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6253
        source = object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6254
        object = lodash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6255
        methodNames = functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6256
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6257
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6258
        chain = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6259
      } else if (isObject(options) && 'chain' in options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6260
        chain = options.chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6261
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6262
      var ctor = object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6263
          isFunc = isFunction(ctor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6265
      forEach(methodNames, function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6266
        var func = object[methodName] = source[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6267
        if (isFunc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6268
          ctor.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6269
            var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6270
                value = this.__wrapped__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6271
                args = [value];
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
            push.apply(args, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6274
            var result = func.apply(object, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6275
            if (chain || chainAll) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6276
              if (value === result && isObject(result)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6277
                return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6278
              }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6279
              result = new ctor(result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6280
              result.__chain__ = chainAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6281
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6282
            return result;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6285
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6286
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6287
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
     * 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
  6290
     * the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6291
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6292
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6293
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6294
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6295
     * @returns {Function} Returns the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6296
     * @example
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
     * var lodash = _.noConflict();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6299
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6300
    function noConflict() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6301
      context._ = oldDash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6302
      return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6303
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6306
     * A no-operation function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6307
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6308
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6309
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6310
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6311
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6312
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6313
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6314
     * _.noop(object) === undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6315
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6316
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6317
    function noop() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6318
      // no operation performed
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
     * 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
  6323
     * (1 January 1970 00:00:00 UTC).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6324
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6325
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6326
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6327
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6328
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6329
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6330
     * var stamp = _.now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6331
     * _.defer(function() { console.log(_.now() - stamp); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6332
     * // => 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
  6333
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6334
    var now = isNative(now = Date.now) && now || function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6335
      return new Date().getTime();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6336
    };
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6339
     * Converts the given value into an integer of the specified radix.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6340
     * 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
  6341
     * `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
  6342
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6343
     * Note: This method avoids differences in native ES3 and ES5 `parseInt`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6344
     * implementations. See http://es5.github.io/#E.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6345
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6346
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6347
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6348
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6349
     * @param {string} value The value to parse.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6350
     * @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
  6351
     * @returns {number} Returns the new integer value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6352
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6353
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6354
     * _.parseInt('08');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6355
     * // => 8
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
    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6358
      // 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
  6359
      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6362
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6363
     * 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
  6364
     * given object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6365
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6366
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6367
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6368
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6369
     * @param {string} key The name of the property to retrieve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6370
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6371
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6372
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6373
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6374
     *   { 'name': 'fred',   'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6375
     *   { 'name': 'barney', 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6376
     * ];
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
     * var getName = _.property('name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6379
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6380
     * _.map(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6381
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6382
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6383
     * _.sortBy(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6384
     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6385
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6386
    function property(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6387
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6388
        return object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6389
      };
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6392
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6393
     * 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
  6394
     * 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
  6395
     * 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
  6396
     * floating-point number will be returned instead of an integer.
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6399
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6400
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6401
     * @param {number} [min=0] The minimum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6402
     * @param {number} [max=1] The maximum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6403
     * @param {boolean} [floating=false] Specify returning a floating-point number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6404
     * @returns {number} Returns a random number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6405
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6406
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6407
     * _.random(0, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6408
     * // => an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6409
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6410
     * _.random(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6411
     * // => also an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6412
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6413
     * _.random(5, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6414
     * // => a floating-point number between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6415
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6416
     * _.random(1.2, 5.2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6417
     * // => a floating-point number between 1.2 and 5.2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6418
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6419
    function random(min, max, floating) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6420
      var noMin = min == null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6421
          noMax = max == null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6422
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6423
      if (floating == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6424
        if (typeof min == 'boolean' && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6425
          floating = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6426
          min = 1;
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
        else if (!noMax && typeof max == 'boolean') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6429
          floating = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6430
          noMax = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6431
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6432
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6433
      if (noMin && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6434
        max = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6435
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6436
      min = +min || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6437
      if (noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6438
        max = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6439
        min = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6440
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6441
        max = +max || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6442
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6443
      if (floating || min % 1 || max % 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6444
        var rand = nativeRandom();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6445
        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
  6446
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6447
      return baseRandom(min, max);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6448
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6449
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6450
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6451
     * 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
  6452
     * 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
  6453
     * 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
  6454
     * is returned.
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
     * @static
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 Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6459
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6460
     * @param {string} key The name of the property to resolve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6461
     * @returns {*} Returns the resolved value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6462
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6463
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6464
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6465
     *   'cheese': 'crumpets',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6466
     *   'stuff': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6467
     *     return 'nonsense';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6468
     *   }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6469
     * };
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
     * _.result(object, 'cheese');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6472
     * // => 'crumpets'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6473
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6474
     * _.result(object, 'stuff');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6475
     * // => 'nonsense'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6476
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6477
    function result(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6478
      if (object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6479
        var value = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6480
        return isFunction(value) ? object[key]() : value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6485
     * A micro-templating method that handles arbitrary delimiters, preserves
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6486
     * whitespace, and correctly escapes quotes within interpolated code.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6487
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6488
     * Note: In the development build, `_.template` utilizes sourceURLs for easier
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6489
     * 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
  6490
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6491
     * For more information on precompiling templates see:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6492
     * http://lodash.com/custom-builds
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6493
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6494
     * For more information on Chrome extension sandboxes see:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6495
     * http://developer.chrome.com/stable/extensions/sandboxingEval.html
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6496
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6497
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6498
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6499
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6500
     * @param {string} text The template text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6501
     * @param {Object} data The data object used to populate the text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6502
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6503
     * @param {RegExp} [options.escape] The "escape" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6504
     * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6505
     * @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
  6506
     * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6507
     * @param {string} [sourceURL] The sourceURL of the template's compiled source.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6508
     * @param {string} [variable] The data object variable name.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6509
     * @returns {Function|string} Returns a compiled function when no `data` object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6510
     *  is given, else it returns the interpolated text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6511
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6512
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6513
     * // using the "interpolate" delimiter to create a compiled template
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6514
     * var compiled = _.template('hello <%= name %>');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6515
     * compiled({ 'name': 'fred' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6516
     * // => 'hello fred'
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
     * // using the "escape" delimiter to escape HTML in data property values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6519
     * _.template('<b><%- value %></b>', { 'value': '<script>' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6520
     * // => '<b>&lt;script&gt;</b>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6521
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6522
     * // using the "evaluate" delimiter to generate HTML
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6523
     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6524
     * _.template(list, { 'people': ['fred', 'barney'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6525
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6526
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6527
     * // 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
  6528
     * _.template('hello ${ name }', { 'name': 'pebbles' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6529
     * // => 'hello pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6530
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6531
     * // using the internal `print` function in "evaluate" delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6532
     * _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6533
     * // => 'hello barney!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6534
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6535
     * // using a custom template delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6536
     * _.templateSettings = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6537
     *   'interpolate': /{{([\s\S]+?)}}/g
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6538
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6539
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6540
     * _.template('hello {{ name }}!', { 'name': 'mustache' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6541
     * // => 'hello mustache!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6542
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6543
     * // using the `imports` option to import jQuery
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6544
     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6545
     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6546
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6547
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6548
     * // 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
  6549
     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6550
     * compiled(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6551
     * // => 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
  6552
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6553
     * // 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
  6554
     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6555
     * compiled.source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6556
     * // => function(data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6557
     *   var __t, __p = '', __e = _.escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6558
     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6559
     *   return __p;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6560
     * }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6561
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6562
     * // using the `source` property to inline compiled templates for meaningful
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6563
     * // line numbers in error messages and a stack trace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6564
     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6565
     *   var JST = {\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6566
     *     "main": ' + _.template(mainText).source + '\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6567
     *   };\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6568
     * ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6569
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6570
    function template(text, data, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6571
      // based on John Resig's `tmpl` implementation
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6572
      // http://ejohn.org/blog/javascript-micro-templating/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6573
      // and Laura Doktorova's doT.js
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6574
      // https://github.com/olado/doT
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6575
      var settings = lodash.templateSettings;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6576
      text = String(text || '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6577
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6578
      // avoid missing dependencies when `iteratorTemplate` is not defined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6579
      options = defaults({}, options, settings);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6580
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6581
      var imports = defaults({}, options.imports, settings.imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6582
          importsKeys = keys(imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6583
          importsValues = values(imports);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6584
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6585
      var isEvaluating,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6586
          index = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6587
          interpolate = options.interpolate || reNoMatch,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6588
          source = "__p += '";
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
      // compile the regexp to match each delimiter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6591
      var reDelimiters = RegExp(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6592
        (options.escape || reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6593
        interpolate.source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6594
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6595
        (options.evaluate || reNoMatch).source + '|$'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6596
      , 'g');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6597
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6598
      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6599
        interpolateValue || (interpolateValue = esTemplateValue);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6600
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6601
        // escape characters that cannot be included in string literals
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6602
        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6603
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6604
        // replace delimiters with snippets
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6605
        if (escapeValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6606
          source += "' +\n__e(" + escapeValue + ") +\n'";
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
        if (evaluateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6609
          isEvaluating = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6610
          source += "';\n" + evaluateValue + ";\n__p += '";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6611
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6612
        if (interpolateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6613
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6614
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6615
        index = offset + match.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6616
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6617
        // the JS engine embedded in Adobe products requires returning the `match`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6618
        // string in order to produce the correct `offset` value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6619
        return match;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6620
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6621
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6622
      source += "';\n";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6623
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6624
      // 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
  6625
      // 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
  6626
      var variable = options.variable,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6627
          hasVariable = variable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6628
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6629
      if (!hasVariable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6630
        variable = 'obj';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6631
        source = 'with (' + variable + ') {\n' + source + '\n}\n';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6632
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6633
      // cleanup code by stripping empty strings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6634
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6635
        .replace(reEmptyStringMiddle, '$1')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6636
        .replace(reEmptyStringTrailing, '$1;');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6637
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6638
      // frame code as the function body
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6639
      source = 'function(' + variable + ') {\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6640
        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6641
        "var __t, __p = '', __e = _.escape" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6642
        (isEvaluating
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6643
          ? ', __j = Array.prototype.join;\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6644
            "function print() { __p += __j.call(arguments, '') }\n"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6645
          : ';\n'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6646
        ) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6647
        source +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6648
        'return __p\n}';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6649
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6650
      // Use a sourceURL for easier debugging.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6651
      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6652
      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
  6653
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6654
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6655
        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6656
      } catch(e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6657
        e.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6658
        throw e;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6659
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6660
      if (data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6661
        return result(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6662
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6663
      // provide the compiled function's source by its `toString` method, in
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6664
      // supported environments, or the `source` property as a convenience for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6665
      // inlining compiled templates during the build process
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6666
      result.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6667
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6668
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6670
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6671
     * Executes the callback `n` times, returning an array of the results
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6672
     * 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
  6673
     * with one argument; (index).
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
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6676
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6677
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6678
     * @param {number} n The number of times to execute the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6679
     * @param {Function} callback The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6680
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6681
     * @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
  6682
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6683
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6684
     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6685
     * // => [3, 6, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6686
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6687
     * _.times(3, function(n) { mage.castSpell(n); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6688
     * // => 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
  6689
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6690
     * _.times(3, function(n) { this.cast(n); }, mage);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6691
     * // => also calls `mage.castSpell(n)` three times
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6692
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6693
    function times(n, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6694
      n = (n = +n) > -1 ? n : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6695
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6696
          result = Array(n);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6697
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6698
      callback = baseCreateCallback(callback, thisArg, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6699
      while (++index < n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6700
        result[index] = callback(index);
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
      return result;
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 inverse of `_.escape` this method converts the HTML entities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6707
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6708
     * corresponding characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6709
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6710
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6711
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6712
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6713
     * @param {string} string The string to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6714
     * @returns {string} Returns the unescaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6715
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6716
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6717
     * _.unescape('Fred, Barney &amp; Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6718
     * // => 'Fred, Barney & Pebbles'
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
    function unescape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6721
      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6722
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6723
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6724
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6725
     * 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
  6726
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6727
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6728
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6729
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6730
     * @param {string} [prefix] The value to prefix the ID with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6731
     * @returns {string} Returns the unique ID.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6732
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6733
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6734
     * _.uniqueId('contact_');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6735
     * // => 'contact_104'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6736
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6737
     * _.uniqueId();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6738
     * // => '105'
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
    function uniqueId(prefix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6741
      var id = ++idCounter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6742
      return String(prefix == null ? '' : prefix) + id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6743
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6744
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6745
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6746
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
     * Creates a `lodash` object that wraps the given value with explicit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6749
     * method chaining enabled.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6750
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6751
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6752
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6753
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6754
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6755
     * @returns {Object} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6756
     * @example
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
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6759
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6760
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6761
     *   { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6762
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6763
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6764
     * var youngest = _.chain(characters)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6765
     *     .sortBy('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6766
     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6767
     *     .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6768
     *     .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6769
     * // => 'pebbles is 1'
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
    function chain(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6772
      value = new lodashWrapper(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6773
      value.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6774
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6775
    }
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6778
     * Invokes `interceptor` with the `value` as the first argument and then
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6779
     * 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
  6780
     * chain in order to perform operations on intermediate results within
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6781
     * the chain.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6782
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6783
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6784
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6785
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6786
     * @param {*} value The value to provide to `interceptor`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6787
     * @param {Function} interceptor The function to invoke.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6788
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6789
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6790
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6791
     * _([1, 2, 3, 4])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6792
     *  .tap(function(array) { array.pop(); })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6793
     *  .reverse()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6794
     *  .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6795
     * // => [3, 2, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6796
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6797
    function tap(value, interceptor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6798
      interceptor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6799
      return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6800
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6801
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6802
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6803
     * Enables explicit method chaining on the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6804
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6805
     * @name chain
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6806
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6807
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6808
     * @returns {*} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6809
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6810
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6811
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6812
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6813
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6814
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6815
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6816
     * // without explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6817
     * _(characters).first();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6818
     * // => { 'name': 'barney', 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6819
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6820
     * // with explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6821
     * _(characters).chain()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6822
     *   .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6823
     *   .pick('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6824
     *   .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6825
     * // => { 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6826
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6827
    function wrapperChain() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6828
      this.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6829
      return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6830
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6831
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6832
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6833
     * Produces the `toString` result of the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6834
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6835
     * @name toString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6836
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6837
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6838
     * @returns {string} Returns the string result.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6839
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6840
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6841
     * _([1, 2, 3]).toString();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6842
     * // => '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6843
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6844
    function wrapperToString() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6845
      return String(this.__wrapped__);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6846
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6847
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6848
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6849
     * Extracts the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6850
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6851
     * @name valueOf
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6852
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6853
     * @alias value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6854
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6855
     * @returns {*} Returns the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6856
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6857
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6858
     * _([1, 2, 3]).valueOf();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6859
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6860
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6861
    function wrapperValueOf() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6862
      return this.__wrapped__;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6863
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6864
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6865
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6866
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6867
    // add functions that return wrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6868
    lodash.after = after;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6869
    lodash.assign = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6870
    lodash.at = at;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6871
    lodash.bind = bind;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6872
    lodash.bindAll = bindAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6873
    lodash.bindKey = bindKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6874
    lodash.chain = chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6875
    lodash.compact = compact;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6876
    lodash.compose = compose;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6877
    lodash.constant = constant;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6878
    lodash.countBy = countBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6879
    lodash.create = create;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6880
    lodash.createCallback = createCallback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6881
    lodash.curry = curry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6882
    lodash.debounce = debounce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6883
    lodash.defaults = defaults;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6884
    lodash.defer = defer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6885
    lodash.delay = delay;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6886
    lodash.difference = difference;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6887
    lodash.filter = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6888
    lodash.flatten = flatten;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6889
    lodash.forEach = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6890
    lodash.forEachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6891
    lodash.forIn = forIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6892
    lodash.forInRight = forInRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6893
    lodash.forOwn = forOwn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6894
    lodash.forOwnRight = forOwnRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6895
    lodash.functions = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6896
    lodash.groupBy = groupBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6897
    lodash.indexBy = indexBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6898
    lodash.initial = initial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6899
    lodash.intersection = intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6900
    lodash.invert = invert;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6901
    lodash.invoke = invoke;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6902
    lodash.keys = keys;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6903
    lodash.map = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6904
    lodash.mapValues = mapValues;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6905
    lodash.max = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6906
    lodash.memoize = memoize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6907
    lodash.merge = merge;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6908
    lodash.min = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6909
    lodash.omit = omit;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6910
    lodash.once = once;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6911
    lodash.pairs = pairs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6912
    lodash.partial = partial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6913
    lodash.partialRight = partialRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6914
    lodash.pick = pick;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6915
    lodash.pluck = pluck;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6916
    lodash.property = property;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6917
    lodash.pull = pull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6918
    lodash.range = range;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6919
    lodash.reject = reject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6920
    lodash.remove = remove;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6921
    lodash.rest = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6922
    lodash.shuffle = shuffle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6923
    lodash.sortBy = sortBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6924
    lodash.tap = tap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6925
    lodash.throttle = throttle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6926
    lodash.times = times;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6927
    lodash.toArray = toArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6928
    lodash.transform = transform;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6929
    lodash.union = union;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6930
    lodash.uniq = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6931
    lodash.values = values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6932
    lodash.where = where;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6933
    lodash.without = without;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6934
    lodash.wrap = wrap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6935
    lodash.xor = xor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6936
    lodash.zip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6937
    lodash.zipObject = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6938
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6939
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6940
    lodash.collect = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6941
    lodash.drop = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6942
    lodash.each = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6943
    lodash.eachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6944
    lodash.extend = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6945
    lodash.methods = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6946
    lodash.object = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6947
    lodash.select = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6948
    lodash.tail = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6949
    lodash.unique = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6950
    lodash.unzip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6951
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6952
    // add functions to `lodash.prototype`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6953
    mixin(lodash);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6954
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6955
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6956
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6957
    // add functions that return unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6958
    lodash.clone = clone;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6959
    lodash.cloneDeep = cloneDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6960
    lodash.contains = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6961
    lodash.escape = escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6962
    lodash.every = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6963
    lodash.find = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6964
    lodash.findIndex = findIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6965
    lodash.findKey = findKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6966
    lodash.findLast = findLast;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6967
    lodash.findLastIndex = findLastIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6968
    lodash.findLastKey = findLastKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6969
    lodash.has = has;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6970
    lodash.identity = identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6971
    lodash.indexOf = indexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6972
    lodash.isArguments = isArguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6973
    lodash.isArray = isArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6974
    lodash.isBoolean = isBoolean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6975
    lodash.isDate = isDate;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6976
    lodash.isElement = isElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6977
    lodash.isEmpty = isEmpty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6978
    lodash.isEqual = isEqual;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6979
    lodash.isFinite = isFinite;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6980
    lodash.isFunction = isFunction;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6981
    lodash.isNaN = isNaN;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6982
    lodash.isNull = isNull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6983
    lodash.isNumber = isNumber;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6984
    lodash.isObject = isObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6985
    lodash.isPlainObject = isPlainObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6986
    lodash.isRegExp = isRegExp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6987
    lodash.isString = isString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6988
    lodash.isUndefined = isUndefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6989
    lodash.lastIndexOf = lastIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6990
    lodash.mixin = mixin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6991
    lodash.noConflict = noConflict;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6992
    lodash.noop = noop;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6993
    lodash.now = now;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6994
    lodash.parseInt = parseInt;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6995
    lodash.random = random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6996
    lodash.reduce = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6997
    lodash.reduceRight = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6998
    lodash.result = result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6999
    lodash.runInContext = runInContext;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7000
    lodash.size = size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7001
    lodash.some = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7002
    lodash.sortedIndex = sortedIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7003
    lodash.template = template;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7004
    lodash.unescape = unescape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7005
    lodash.uniqueId = uniqueId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7006
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7007
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7008
    lodash.all = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7009
    lodash.any = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7010
    lodash.detect = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7011
    lodash.findWhere = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7012
    lodash.foldl = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7013
    lodash.foldr = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7014
    lodash.include = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7015
    lodash.inject = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7016
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7017
    mixin(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7018
      var source = {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7019
      forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7020
        if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7021
          source[methodName] = func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7022
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7023
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7024
      return source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7025
    }(), false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7026
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7027
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7028
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7029
    // add functions capable of returning wrapped and unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7030
    lodash.first = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7031
    lodash.last = last;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7032
    lodash.sample = sample;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7033
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7034
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7035
    lodash.take = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7036
    lodash.head = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7037
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7038
    forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7039
      var callbackable = methodName !== 'sample';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7040
      if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7041
        lodash.prototype[methodName]= function(n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7042
          var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7043
              result = func(this.__wrapped__, n, guard);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7044
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7045
          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7046
            ? result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7047
            : new lodashWrapper(result, chainAll);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7048
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7049
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7050
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7051
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7052
    /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7053
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7054
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7055
     * The semantic version number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7056
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7057
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7058
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7059
     * @type string
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7060
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7061
    lodash.VERSION = '2.4.1';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7062
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7063
    // add "Chaining" functions to the wrapper
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7064
    lodash.prototype.chain = wrapperChain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7065
    lodash.prototype.toString = wrapperToString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7066
    lodash.prototype.value = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7067
    lodash.prototype.valueOf = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7068
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7069
    // add `Array` functions that return unwrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7070
    baseEach(['join', 'pop', 'shift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7071
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7072
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7073
        var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7074
            result = func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7075
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7076
        return chainAll
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7077
          ? new lodashWrapper(result, chainAll)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7078
          : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7079
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7080
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7081
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7082
    // add `Array` functions that return the existing wrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7083
    baseEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7084
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7085
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7086
        func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7087
        return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7088
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7089
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7090
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7091
    // add `Array` functions that return new wrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7092
    baseEach(['concat', 'slice', 'splice'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7093
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7094
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7095
        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7096
      };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7097
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7098
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7099
    // avoid array-like object bugs with `Array#shift` and `Array#splice`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7100
    // in IE < 9, Firefox < 10, Narwhal, and RingoJS
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7101
    if (!support.spliceObjects) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7102
      baseEach(['pop', 'shift', 'splice'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7103
        var func = arrayRef[methodName],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7104
            isSplice = methodName == 'splice';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7105
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7106
        lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7107
          var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7108
              value = this.__wrapped__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7109
              result = func.apply(value, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7111
          if (value.length === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7112
            delete value[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7113
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7114
          return (chainAll || isSplice)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7115
            ? new lodashWrapper(result, chainAll)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7116
            : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7117
        };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7118
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7119
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7120
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7121
    return lodash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7122
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7123
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7124
  /*--------------------------------------------------------------------------*/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7125
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7126
  // expose Lo-Dash
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7127
  var _ = runInContext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7128
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7129
  // 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
  7130
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7131
    // 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
  7132
    // case Lo-Dash is loaded with a RequireJS shim config.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7133
    // See http://requirejs.org/docs/api.html#config-shim
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7134
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7136
    // 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
  7137
    // referenced as the "underscore" module
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7138
    define(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7139
      return _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7140
    });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7141
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7142
  // 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
  7143
  else if (freeExports && freeModule) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7144
    // in Node.js or RingoJS
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7145
    if (moduleExports) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7146
      (freeModule.exports = _)._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7147
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7148
    // in Narwhal or Rhino -require
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7149
    else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7150
      freeExports._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7151
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7152
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7153
  else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7154
    // in a browser or Rhino
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7155
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7156
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7157
}.call(this));