server/php/basic/public_html/static/lib/lodash/lodash.compat.js
author durandn
Thu, 21 Apr 2016 15:18:19 +0200
changeset 605 13d355fd09bf
parent 488 1324bd8747ff
permissions -rw-r--r--
updated uri to allow optional trailing slash on single resource URIs (django automatic redirects don't carry over the Authorization header that can sometimes be needed, for instance with OAuth)
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
488
1324bd8747ff grunt copy-server the new changes of the client
rougeronj
parents: 461
diff changeset
     3
 * Lo-Dash 2.4.2 (Custom Build) <https://lodash.com/>
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * Build: `lodash -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
488
1324bd8747ff grunt copy-server the new changes of the client
rougeronj
parents: 461
diff changeset
     8
 * Available under MIT license <https://lodash.com/license>
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
;(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
  /** Used as a safe reference for `undefined` in pre ES5 environments */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  var undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
  /** Used to pool arrays and objects used internally */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  var arrayPool = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
      objectPool = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
  /** Used to generate unique IDs */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  var idCounter = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  /** Used 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);
488
1324bd8747ff grunt copy-server the new changes of the client
rougeronj
parents: 461
diff changeset
  1821
      descriptor.value = null;
442
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
     * A fallback implementation of `isPlainObject` which checks if a given value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
     * is an object created by the `Object` constructor, assuming objects created
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
     * by the `Object` constructor have no inherited enumerable properties and that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
     * there are no `Object.prototype` extensions.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1832
     * @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
  1833
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
    function shimIsPlainObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
      var ctor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
      // avoid non Object objects, `arguments` objects, and DOM elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
      if (!(value && toString.call(value) == objectClass) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
          (ctor = value.constructor, isFunction(ctor) && !(ctor instanceof ctor)) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
          (!support.argsClass && isArguments(value)) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
          (!support.nodeClass && isNode(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1843
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1844
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
      // IE < 9 iterates inherited properties before own properties. If the first
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
      // 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
  1847
      // enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
      if (support.ownLast) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
        forIn(value, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
          result = hasOwnProperty.call(object, key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
          return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
        return result !== false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
      // In most environments an object's own properties are iterated before
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1856
      // 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
  1857
      // own property then there are no inherited enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
      forIn(value, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
        result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
      return typeof result == 'undefined' || hasOwnProperty.call(value, result);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
     * Used by `unescape` to convert HTML entities to characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
     * @param {string} match The matched character to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
     * @returns {string} Returns the unescaped character.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
    function unescapeHtmlChar(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
      return htmlUnescapes[match];
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
     * Checks if `value` is an `arguments` object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1884
     * @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
  1885
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
     * (function() { return _.isArguments(arguments); })(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
     * _.isArguments([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1891
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1892
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
    function isArguments(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
        toString.call(value) == argsClass || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
    // fallback for browsers that can't detect `arguments` objects by [[Class]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
    if (!support.argsClass) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
      isArguments = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
        return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
          hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
     * Checks if `value` is an array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1913
     * @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
  1914
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
     * (function() { return _.isArray(arguments); })();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1917
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1918
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
     * _.isArray([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
    var isArray = nativeIsArray || function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
      return value && typeof value == 'object' && typeof value.length == 'number' &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
        toString.call(value) == arrayClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1928
     * 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
  1929
     * given object's own enumerable property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1930
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1934
     * @returns {Array} Returns an array of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1935
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
    var shimKeys = createIterator({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
      'args': 'object',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
      'init': '[]',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
      'top': 'if (!(objectTypes[typeof object])) return result',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1940
      'loop': 'result.push(index)'
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1944
     * 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
  1945
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1946
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1947
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1948
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
     * @returns {Array} Returns an array of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
     * _.keys({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
     * // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
    var keys = !nativeKeys ? shimKeys : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
        return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
      if ((support.enumPrototypes && typeof object == 'function') ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
          (support.nonEnumArgs && object.length && isArguments(object))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
        return shimKeys(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1964
      return nativeKeys(object);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
    /** Reusable iterator options shared by `each`, `forIn`, and `forOwn` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
    var eachIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
      'args': 'collection, callback, thisArg',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
      'top': "callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
      'array': "typeof length == 'number'",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
      'keys': keys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
      'loop': 'if (callback(iterable[index], index, collection) === false) return result'
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
    /** Reusable iterator options for `assign` and `defaults` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
    var defaultsIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
      'args': 'object, source, guard',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
      'top':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
        'var args = arguments,\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
        '    argsIndex = 0,\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
        "    argsLength = typeof guard == 'number' ? 2 : args.length;\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
        'while (++argsIndex < argsLength) {\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
        '  iterable = args[argsIndex];\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
        '  if (iterable && objectTypes[typeof iterable]) {',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
      'keys': keys,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
      'loop': "if (typeof result[index] == 'undefined') result[index] = iterable[index]",
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
      'bottom': '  }\n}'
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
    /** Reusable iterator options for `forIn` and `forOwn` */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
    var forOwnIteratorOptions = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
      'top': 'if (!objectTypes[typeof iterable]) return result;\n' + eachIteratorOptions.top,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
      'array': false
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
     * Used to convert characters to HTML entities:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
     * Though the `>` character is escaped for symmetry, characters like `>` and `/`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2001
     * 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
  2002
     * of a tag or an unquoted attribute value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
     * http://mathiasbynens.be/notes/ambiguous-ampersands (under "semi-related fun fact")
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
    var htmlEscapes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
      '&': '&amp;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
      '<': '&lt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
      '>': '&gt;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
      '"': '&quot;',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
      "'": '&#39;'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2011
    };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2012
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
    /** Used to convert HTML entities to characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
    var htmlUnescapes = invert(htmlEscapes);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
    /** Used to match HTML entities and HTML characters */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
    var reEscapedHtml = RegExp('(' + keys(htmlUnescapes).join('|') + ')', 'g'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
        reUnescapedHtml = RegExp('[' + keys(htmlEscapes).join('') + ']', 'g');
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
     * A function compiled to iterate `arguments` objects, arrays, objects, and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
     * strings consistenly across environments, executing the callback for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
     * 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
  2024
     * with three arguments; (value, index|key, collection). Callbacks may exit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2025
     * iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2026
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
     * @private
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2032
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2033
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
    var baseEach = createIterator(eachIteratorOptions);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
     * object. Subsequent sources will overwrite property assignments of previous
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2041
     * 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
  2042
     * 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
  2043
     * arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
     * @alias extend
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
     * @param {Function} [callback] The function to customize assigning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2055
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2056
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2057
     * _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2058
     * // => { 'name': 'fred', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2059
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2060
     * var defaults = _.partialRight(_.assign, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2061
     *   return typeof a == 'undefined' ? b : a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2062
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2063
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2064
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2065
     * defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2066
     * // => { 'name': 'barney', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2067
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2068
    var assign = createIterator(defaultsIteratorOptions, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2069
      'top':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2070
        defaultsIteratorOptions.top.replace(';',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2071
          ';\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2072
          "if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2073
          '  var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2074
          "} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2075
          '  callback = args[--argsLength];\n' +
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
        ),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2078
      'loop': 'result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]'
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2082
     * 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
  2083
     * 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
  2084
     * 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
  2085
     * callback returns `undefined` cloning will be handled by the method instead.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2086
     * 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
  2087
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2088
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2089
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2090
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2091
     * @param {*} value The value to clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2092
     * @param {boolean} [isDeep=false] Specify a deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2093
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2094
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2095
     * @returns {*} Returns the cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2096
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2097
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2098
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2099
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2100
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2103
     * var shallow = _.clone(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2104
     * shallow[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
     * var deep = _.clone(characters, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2109
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2110
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
     * _.mixin({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
     *   'clone': _.partialRight(_.clone, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
     *     return _.isElement(value) ? value.cloneNode(false) : undefined;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
     * var clone = _.clone(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
     * clone.childNodes.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
    function clone(value, isDeep, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
      // allows working with "Collections" methods without using their `index`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
      // and `collection` arguments for `isDeep` and `callback`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
      if (typeof isDeep != 'boolean' && isDeep != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
        callback = isDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
        isDeep = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
      return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2133
     * 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
  2134
     * executed to produce the cloned values. If the callback returns `undefined`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2135
     * 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
  2136
     * `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2138
     * 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
  2139
     * 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
  2140
     * 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
  2141
     * 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
  2142
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
     * @param {*} value The value to deep clone.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
     * @param {Function} [callback] The function to customize cloning values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
     * @returns {*} Returns the deep cloned value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2154
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
     * var deep = _.cloneDeep(characters);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
     * deep[0] === characters[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2163
     *   'node': element
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
     * var clone = _.cloneDeep(view, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2167
     *   return _.isElement(value) ? value.cloneNode(true) : undefined;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
     * clone.node == view.node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2171
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2172
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
    function cloneDeep(value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
      return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2178
     * 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
  2179
     * `properties` object is provided its own enumerable properties are assigned
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
     * to the created object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
     * @param {Object} prototype The object to inherit from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
     * @param {Object} [properties] The properties to assign to the object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
     * @returns {Object} Returns the new object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
     *   this.y = 0;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
     * function Circle() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2196
     *   Shape.call(this);
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2199
     * Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2200
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
     * var circle = new Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
     * circle instanceof Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
     * circle instanceof Shape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
    function create(prototype, properties) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
      var result = baseCreate(prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
      return properties ? assign(result, properties) : result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2211
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2212
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2213
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
     * Assigns own enumerable properties of source object(s) to the destination
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
     * object for all destination properties that resolve to `undefined`. Once a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2216
     * 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
  2217
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
     * @param- {Object} [guard] Allows working with `_.reduce` without using its
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
     *  `key` and `object` arguments as sources.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
     * var object = { 'name': 'barney' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
     * _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2231
     * // => { 'name': 'barney', 'employer': 'slate' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2232
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2233
    var defaults = createIterator(defaultsIteratorOptions);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2236
     * 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
  2237
     * 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
  2238
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2239
     * 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
  2240
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2241
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2242
     * 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
  2243
     * 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
  2244
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2251
     *  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
  2252
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2254
     * @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
  2255
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
     *   'barney': {  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
     *   'fred': {    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2260
     *   'pebbles': { 'age': 1,  'blocked': false }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
     * _.findKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2264
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2265
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
     * // => 'barney' (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
     * _.findKey(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
     * _.findKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
     * // => 'fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
    function findKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2282
          return false;
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2285
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
     * This method is like `_.findKey` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2290
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2291
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2292
     * 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
  2293
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2294
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
     * 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
  2296
     * 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
  2297
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2298
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
     * @param {Object} object The object to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
     * @param {Function|Object|string} [callback=identity] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2304
     *  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
  2305
     *  create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2307
     * @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
  2308
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
     *   'barney': {  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
     *   'fred': {    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
     *   'pebbles': { 'age': 1,  'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
     * _.findLastKey(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
     * // => returns `pebbles`, assuming `_.findKey` returns `barney`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
     * _.findLastKey(characters, { 'age': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2323
     * // => 'fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2324
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
     * _.findLastKey(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
     * // => 'pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
    function findLastKey(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
      forOwnRight(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
        if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
          result = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
          return false;
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
     * Iterates over own and inherited enumerable properties of an object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2343
     * 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
  2344
     * and invoked with three arguments; (value, key, object). Callbacks may exit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2345
     * iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2346
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
     *   this.y = 0;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2364
     *   this.y += y;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
     * _.forIn(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2370
     * // => 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
  2371
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
    var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2373
      'useHas': false
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
     * This method is like `_.forIn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2378
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2379
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2386
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2387
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2388
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
     *   this.y = 0;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
     * Shape.prototype.move = function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
     *   this.x += x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
     *   this.y += y;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
     * _.forInRight(new Shape, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2402
     * // => 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
  2403
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
    function forInRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2405
      var pairs = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2406
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2408
        pairs.push(key, value);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
      var length = pairs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2413
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2414
        if (callback(pairs[length--], pairs[length], object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2415
          break;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2418
      return object;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2422
     * Iterates over own enumerable properties of an object, executing the callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2423
     * 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
  2424
     * arguments; (value, key, object). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2425
     * explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2426
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2427
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2428
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2429
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2430
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2431
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2432
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2433
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2434
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2435
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2436
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2437
     * _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2438
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2439
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2440
     * // => 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
  2441
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2442
    var forOwn = createIterator(eachIteratorOptions, forOwnIteratorOptions);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2445
     * This method is like `_.forOwn` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2446
     * of a `collection` in the opposite order.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2447
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2448
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2449
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2450
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2451
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2452
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2453
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2454
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2455
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2456
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
     * _.forOwnRight({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2458
     *   console.log(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2459
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2460
     * // => 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
  2461
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2462
    function forOwnRight(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2463
      var props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2464
          length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2465
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2466
      callback = baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2467
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2468
        var key = props[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2469
        if (callback(object[key], key, object) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2470
          break;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2473
      return object;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2477
     * Creates a sorted array of property names of all enumerable properties,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2478
     * own and inherited, of `object` that have function values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2479
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2480
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2481
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2482
     * @alias methods
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2483
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2484
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2485
     * @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
  2486
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2487
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2488
     * _.functions(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
     * // => ['all', 'any', 'bind', 'bindAll', 'clone', 'compact', 'compose', ...]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
    function functions(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
      forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
        if (isFunction(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
          result.push(key);
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
      return result.sort();
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2502
     * 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
  2503
     * instead of an inherited property.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2504
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
     * @param {string} key The name of the property to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2510
     * @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
  2511
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2512
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
     * _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2514
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2515
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
    function has(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2517
      return object ? hasOwnProperty.call(object, key) : false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2521
     * 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
  2522
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
     * @param {Object} object The object to invert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
     * @returns {Object} Returns the created inverted object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2528
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2529
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
     * _.invert({ 'first': 'fred', 'second': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
     * // => { 'fred': 'first', 'barney': 'second' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2533
    function invert(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2534
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2535
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2536
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2537
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2538
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2539
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2540
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
        result[object[key]] = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2547
     * Checks if `value` is a boolean value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2548
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2549
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2550
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2551
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2552
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2553
     * @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
  2554
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2555
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2556
     * _.isBoolean(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2557
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2558
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2559
    function isBoolean(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2560
      return value === true || value === false ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2561
        value && typeof value == 'object' && toString.call(value) == boolClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2565
     * Checks if `value` is a date.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2566
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2567
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2568
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2569
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2570
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2571
     * @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
  2572
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2573
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2574
     * _.isDate(new Date);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2575
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2576
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2577
    function isDate(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
      return value && typeof value == 'object' && toString.call(value) == dateClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2582
     * Checks if `value` is a DOM element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2583
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2588
     * @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
  2589
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2591
     * _.isElement(document.body);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2592
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2593
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2594
    function isElement(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2595
      return value && value.nodeType === 1 || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2599
     * 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
  2600
     * 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
  2601
     * "empty".
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2602
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2603
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2604
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2605
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2606
     * @param {Array|Object|string} value The value to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2607
     * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2608
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2609
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2610
     * _.isEmpty([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2611
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2612
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2613
     * _.isEmpty({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2614
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2615
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2616
     * _.isEmpty('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2617
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2618
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2619
    function isEmpty(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2620
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2621
      if (!value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2622
        return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2623
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2624
      var className = toString.call(value),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2625
          length = value.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2626
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2627
      if ((className == arrayClass || className == stringClass ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2628
          (support.argsClass ? className == argsClass : isArguments(value))) ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2629
          (className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2630
        return !length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2631
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2632
      forOwn(value, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2633
        return (result = false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2634
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2635
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2639
     * 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
  2640
     * 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
  2641
     * to compare values. If the callback returns `undefined` comparisons will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2642
     * 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
  2643
     * invoked with two arguments; (a, b).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2644
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2645
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2646
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2647
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2648
     * @param {*} a The value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2649
     * @param {*} b The other value to compare.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2650
     * @param {Function} [callback] The function to customize comparing values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2651
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2652
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2653
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2654
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2655
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2656
     * var copy = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2657
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2658
     * object == copy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2659
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2660
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2661
     * _.isEqual(object, copy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2662
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2663
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2664
     * var words = ['hello', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2665
     * var otherWords = ['hi', 'goodbye'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2666
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2667
     * _.isEqual(words, otherWords, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2668
     *   var reGreet = /^(?:hello|hi)$/i,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2669
     *       aGreet = _.isString(a) && reGreet.test(a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2670
     *       bGreet = _.isString(b) && reGreet.test(b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2671
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2672
     *   return (aGreet || bGreet) ? (aGreet == bGreet) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2673
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2674
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2675
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2676
    function isEqual(a, b, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2677
      return baseIsEqual(a, b, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 2));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2681
     * 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
  2682
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2683
     * 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
  2684
     * 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
  2685
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2686
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2687
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2688
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2689
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2690
     * @returns {boolean} Returns `true` if the `value` is finite, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2691
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2692
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2693
     * _.isFinite(-101);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2694
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2695
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2696
     * _.isFinite('10');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2697
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2698
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2699
     * _.isFinite(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2700
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2701
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2702
     * _.isFinite('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2703
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2704
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2705
     * _.isFinite(Infinity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2706
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2707
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2708
    function isFinite(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2709
      return nativeIsFinite(value) && !nativeIsNaN(parseFloat(value));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2713
     * Checks if `value` is a function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2714
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2715
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2716
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2717
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2718
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2719
     * @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
  2720
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2721
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2722
     * _.isFunction(_);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2723
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2724
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2725
    function isFunction(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2726
      return typeof value == 'function';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2727
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2728
    // fallback for older versions of Chrome and Safari
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2729
    if (isFunction(/x/)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2730
      isFunction = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2731
        return typeof value == 'function' && toString.call(value) == funcClass;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2736
     * Checks if `value` is the language type of Object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2737
     * (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
  2738
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2739
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2740
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2741
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2742
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2743
     * @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
  2744
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2745
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2746
     * _.isObject({});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2747
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2748
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2749
     * _.isObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2750
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2751
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2752
     * _.isObject(1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2753
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2754
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2755
    function isObject(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2756
      // check if the value is the ECMAScript language type of Object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2757
      // http://es5.github.io/#x8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2758
      // and avoid a V8 bug
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2759
      // http://code.google.com/p/v8/issues/detail?id=2291
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2760
      return !!(value && objectTypes[typeof value]);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2764
     * Checks if `value` is `NaN`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2765
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2766
     * 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
  2767
     * `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
  2768
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2769
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2770
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2771
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2772
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2773
     * @returns {boolean} Returns `true` if the `value` is `NaN`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2774
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2775
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2776
     * _.isNaN(NaN);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2777
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2778
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2779
     * _.isNaN(new Number(NaN));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2780
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2781
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2782
     * isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2783
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2784
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2785
     * _.isNaN(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2786
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2787
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2788
    function isNaN(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2789
      // `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
  2790
      // (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
  2791
      return isNumber(value) && value != +value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2795
     * Checks if `value` is `null`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2796
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2797
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2798
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2799
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2800
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2801
     * @returns {boolean} Returns `true` if the `value` is `null`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2802
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2803
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2804
     * _.isNull(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2805
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2806
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2807
     * _.isNull(undefined);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2808
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2809
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2810
    function isNull(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2811
      return value === null;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2815
     * Checks if `value` is a number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2816
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2817
     * 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
  2818
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2819
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2820
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2821
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2822
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2823
     * @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
  2824
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2825
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2826
     * _.isNumber(8.4 * 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2827
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2828
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2829
    function isNumber(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2830
      return typeof value == 'number' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2831
        value && typeof value == 'object' && toString.call(value) == numberClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2835
     * Checks if `value` is an object created by the `Object` constructor.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2836
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2837
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2838
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2839
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2840
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2841
     * @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
  2842
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2843
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2844
     * function Shape() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2845
     *   this.x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2846
     *   this.y = 0;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2849
     * _.isPlainObject(new Shape);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2850
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2851
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2852
     * _.isPlainObject([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2853
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2854
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2855
     * _.isPlainObject({ 'x': 0, 'y': 0 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2856
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2857
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2858
    var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2859
      if (!(value && toString.call(value) == objectClass) || (!support.argsClass && isArguments(value))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2860
        return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2861
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2862
      var valueOf = value.valueOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2863
          objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2864
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2865
      return objProto
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2866
        ? (value == objProto || getPrototypeOf(value) == objProto)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2867
        : shimIsPlainObject(value);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2871
     * Checks if `value` is a regular expression.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2872
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2873
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2874
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2875
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2876
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2877
     * @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
  2878
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2879
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2880
     * _.isRegExp(/fred/);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2881
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2882
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2883
    function isRegExp(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2884
      return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2888
     * Checks if `value` is a string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2889
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2890
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2891
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2892
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2893
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2894
     * @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
  2895
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2896
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2897
     * _.isString('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2898
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2899
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2900
    function isString(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2901
      return typeof value == 'string' ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2902
        value && typeof value == 'object' && toString.call(value) == stringClass || false;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2906
     * Checks if `value` is `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2907
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2908
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2909
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2910
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2911
     * @param {*} value The value to check.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2912
     * @returns {boolean} Returns `true` if the `value` is `undefined`, else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2913
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2914
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2915
     * _.isUndefined(void 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2916
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2917
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2918
    function isUndefined(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2919
      return typeof value == 'undefined';
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2923
     * 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
  2924
     * running each own enumerable property of `object` through the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2925
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2926
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2927
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2928
     * 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
  2929
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2930
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2931
     * 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
  2932
     * 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
  2933
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2934
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2935
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2936
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2937
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2938
     * @param {Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2939
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2940
     *  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
  2941
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2942
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2943
     * @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
  2944
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2945
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2946
     * _.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
  2947
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2948
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2949
     * var characters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2950
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2951
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2952
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2953
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2954
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2955
     * _.mapValues(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2956
     * // => { 'fred': 40, 'pebbles': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2957
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2958
    function mapValues(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2959
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2960
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2961
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2962
      forOwn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2963
        result[key] = callback(value, key, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2964
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2965
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2969
     * Recursively merges own enumerable properties of the source object(s), that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2970
     * don't resolve to `undefined` into the destination object. Subsequent sources
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2971
     * will overwrite property assignments of previous sources. If a callback is
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2972
     * 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
  2973
     * and source properties. If the callback returns `undefined` merging will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2974
     * 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
  2975
     * invoked with two arguments; (objectValue, sourceValue).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2976
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2977
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2978
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2979
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2980
     * @param {Object} object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2981
     * @param {...Object} [source] The source objects.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2982
     * @param {Function} [callback] The function to customize merging properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2983
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2984
     * @returns {Object} Returns the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2985
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2986
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2987
     * var names = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2988
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2989
     *     { 'name': 'barney' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2990
     *     { 'name': 'fred' }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2994
     * var ages = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2995
     *   'characters': [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2996
     *     { 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2997
     *     { 'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3001
     * _.merge(names, ages);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3002
     * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3003
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3004
     * var food = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3005
     *   'fruits': ['apple'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3006
     *   'vegetables': ['beet']
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3009
     * var otherFood = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3010
     *   'fruits': ['banana'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3011
     *   'vegetables': ['carrot']
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3014
     * _.merge(food, otherFood, function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3015
     *   return _.isArray(a) ? a.concat(b) : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3016
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3017
     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3018
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3019
    function merge(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3020
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3021
          length = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3022
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3023
      if (!isObject(object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3024
        return object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3025
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3026
      // allows working with `_.reduce` and `_.reduceRight` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3027
      // their `index` and `collection` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3028
      if (typeof args[2] != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3029
        length = args.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3030
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3031
      if (length > 3 && typeof args[length - 2] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3032
        var callback = baseCreateCallback(args[--length - 1], args[length--], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3033
      } else if (length > 2 && typeof args[length - 1] == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3034
        callback = args[--length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3035
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3036
      var sources = slice(arguments, 1, length),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3037
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3038
          stackA = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3039
          stackB = getArray();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3040
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3041
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3042
        baseMerge(object, sources[index], callback, stackA, stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3043
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3044
      releaseArray(stackA);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3045
      releaseArray(stackB);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3046
      return object;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3050
     * Creates a shallow clone of `object` excluding the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3051
     * 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
  3052
     * 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
  3053
     * property of `object` omitting the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3054
     * 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
  3055
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3056
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3057
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3058
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3059
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3060
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3061
     * @param {Function|...string|string[]} [callback] The properties to omit or the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3062
     *  function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3063
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3064
     * @returns {Object} Returns an object without the omitted properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3065
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3066
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3067
     * _.omit({ 'name': 'fred', 'age': 40 }, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3068
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3069
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3070
     * _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3071
     *   return typeof value == 'number';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3072
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3073
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3074
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3075
    function omit(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3076
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3077
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3078
        var props = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3079
        forIn(object, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3080
          props.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3081
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3082
        props = baseDifference(props, baseFlatten(arguments, true, false, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3083
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3084
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3085
            length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3086
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3087
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3088
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3089
          result[key] = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3090
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3091
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3092
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3093
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3094
          if (!callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3095
            result[key] = value;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3099
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3103
     * 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
  3104
     * i.e. `[[key1, value1], [key2, value2]]`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3105
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3106
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3107
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3108
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3109
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3110
     * @returns {Array} Returns new array of key-value pairs.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3111
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3112
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3113
     * _.pairs({ 'barney': 36, 'fred': 40 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3114
     * // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3115
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3116
    function pairs(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3117
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3118
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3119
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3120
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3121
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3122
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3123
        var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3124
        result[index] = [key, object[key]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3125
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3126
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3130
     * Creates a shallow clone of `object` composed of the specified properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3131
     * 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
  3132
     * 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
  3133
     * property of `object` picking the properties the callback returns truey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3134
     * 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
  3135
     * (value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3136
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3137
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3138
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3139
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3140
     * @param {Object} object The source object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3141
     * @param {Function|...string|string[]} [callback] The function called per
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3142
     *  iteration or property names to pick, specified as individual property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3143
     *  names or arrays of property names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3144
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3145
     * @returns {Object} Returns an object composed of the picked properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3146
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3147
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3148
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3149
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3150
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3151
     * _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3152
     *   return key.charAt(0) != '_';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3153
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3154
     * // => { 'name': 'fred' }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3155
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3156
    function pick(object, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3157
      var result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3158
      if (typeof callback != 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3159
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3160
            props = baseFlatten(arguments, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3161
            length = isObject(object) ? props.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3162
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3163
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3164
          var key = props[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3165
          if (key in object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3166
            result[key] = object[key];
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3169
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3170
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3171
        forIn(object, function(value, key, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3172
          if (callback(value, key, object)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3173
            result[key] = value;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3177
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3181
     * An alternative to `_.reduce` this method transforms `object` to a new
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3182
     * `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
  3183
     * enumerable properties through a callback, with each callback execution
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3184
     * potentially mutating the `accumulator` object. The callback is bound to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3185
     * `thisArg` and invoked with four arguments; (accumulator, value, key, object).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3186
     * Callbacks may exit iteration early by explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3187
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3188
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3189
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3190
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3191
     * @param {Array|Object} object The object to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3192
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3193
     * @param {*} [accumulator] The custom accumulator value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3194
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3195
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3196
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3197
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3198
     * 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
  3199
     *   num *= num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3200
     *   if (num % 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3201
     *     return result.push(num) < 3;
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
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3204
     * // => [1, 9, 25]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3205
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3206
     * 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
  3207
     *   result[key] = num * 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3208
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3209
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3210
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3211
    function transform(object, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3212
      var isArr = isArray(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3213
      if (accumulator == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3214
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3215
          accumulator = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3216
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3217
          var ctor = object && object.constructor,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3218
              proto = ctor && ctor.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3219
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3220
          accumulator = baseCreate(proto);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3223
      if (callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3224
        callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3225
        (isArr ? baseEach : forOwn)(object, function(value, index, object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3226
          return callback(accumulator, value, index, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3227
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3228
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3229
      return accumulator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3230
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3231
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3232
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3233
     * 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
  3234
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3235
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3236
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3237
     * @category Objects
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3238
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3239
     * @returns {Array} Returns an array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3240
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3241
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3242
     * _.values({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3243
     * // => [1, 2, 3] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3244
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3245
    function values(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3246
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3247
          props = keys(object),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3248
          length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3249
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3250
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3251
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3252
        result[index] = object[props[index]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3253
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3254
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3260
     * 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
  3261
     * `collection`. Indexes may be specified as individual arguments or as arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3262
     * of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3263
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3264
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3265
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3266
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3267
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3268
     * @param {...(number|number[]|string|string[])} [index] The indexes of `collection`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3269
     *   to retrieve, specified as individual indexes or arrays of indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3270
     * @returns {Array} Returns a new array of elements corresponding to the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3271
     *  provided indexes.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3272
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3273
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3274
     * _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3275
     * // => ['a', 'c', 'e']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3276
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3277
     * _.at(['fred', 'barney', 'pebbles'], 0, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3278
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3279
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3280
    function at(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3281
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3282
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3283
          props = baseFlatten(args, true, false, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3284
          length = (args[2] && args[2][args[1]] === collection) ? 1 : props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3285
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3287
      if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3288
        collection = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3289
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3290
      while(++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3291
        result[index] = collection[props[index]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3292
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3293
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3297
     * 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
  3298
     * 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
  3299
     * offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3300
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3301
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3302
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3303
     * @alias include
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3304
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3305
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3306
     * @param {*} target The value to check for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3307
     * @param {number} [fromIndex=0] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3308
     * @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
  3309
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3310
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3311
     * _.contains([1, 2, 3], 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3312
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3313
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3314
     * _.contains([1, 2, 3], 1, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3315
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3316
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3317
     * _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3318
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3319
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3320
     * _.contains('pebbles', 'eb');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3321
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3322
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3323
    function contains(collection, target, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3324
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3325
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3326
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3327
          result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3328
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3329
      fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3330
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3331
        result = indexOf(collection, target, fromIndex) > -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3332
      } else if (typeof length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3333
        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
  3334
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3335
        baseEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3336
          if (++index >= fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3337
            return !(result = value === target);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3341
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3345
     * 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
  3346
     * each element of `collection` through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3347
     * 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
  3348
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3349
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3350
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3351
     * 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
  3352
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3353
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3354
     * 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
  3355
     * 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
  3356
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3357
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3358
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3359
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3360
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3361
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3362
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3363
     *  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
  3364
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3365
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3366
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3367
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3368
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3369
     * _.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
  3370
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3371
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3372
     * _.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
  3373
     * // => { '4': 1, '6': 2 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3374
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3375
     * _.countBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3376
     * // => { '3': 2, '5': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3377
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3378
    var countBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3379
      (hasOwnProperty.call(result, key) ? result[key]++ : result[key] = 1);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3383
     * 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
  3384
     * 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
  3385
     * arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3386
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3387
     * 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
  3388
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3389
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3390
     * 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
  3391
     * 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
  3392
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3393
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3394
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3395
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3396
     * @alias all
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3397
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3398
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3399
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3400
     *  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
  3401
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3402
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3403
     * @returns {boolean} Returns `true` if all elements passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3404
     *  else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3405
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3406
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3407
     * _.every([true, 1, null, 'yes']);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3408
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3409
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3410
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3411
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3412
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3415
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3416
     * _.every(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3417
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3418
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3419
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3420
     * _.every(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3421
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3422
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3423
    function every(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3424
      var result = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3425
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3426
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3427
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3428
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3429
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3430
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3431
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3432
          if (!(result = !!callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3433
            break;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3436
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3437
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3438
          return (result = !!callback(value, index, collection));
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3441
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3445
     * 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
  3446
     * 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
  3447
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3448
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3449
     * 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
  3450
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3451
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3452
     * 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
  3453
     * 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
  3454
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3455
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3456
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3457
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3458
     * @alias select
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3459
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3460
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3461
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3462
     *  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
  3463
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3464
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3465
     * @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
  3466
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3467
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3468
     * 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
  3469
     * // => [2, 4, 6]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3470
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3471
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3472
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3473
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3476
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3477
     * _.filter(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3478
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3479
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3480
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3481
     * _.filter(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3482
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3483
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3484
    function filter(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3485
      var result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3486
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3487
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3488
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3489
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3490
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3491
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3492
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3493
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3494
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3495
            result.push(value);
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3498
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3499
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3500
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3501
            result.push(value);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3505
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3509
     * Iterates over elements of a collection, returning the first element that
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3510
     * 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
  3511
     * invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3512
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3513
     * 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
  3514
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3515
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3516
     * 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
  3517
     * 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
  3518
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3519
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3520
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3521
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3522
     * @alias detect, findWhere
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3523
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3524
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3525
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3526
     *  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
  3527
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3528
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3529
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3530
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3531
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3532
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3533
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3534
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3535
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3538
     * _.find(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3539
     *   return chr.age < 40;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3540
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3541
     * // => { 'name': 'barney', 'age': 36, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3542
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3543
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3544
     * _.find(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3545
     * // =>  { 'name': 'pebbles', 'age': 1, 'blocked': false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3546
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3547
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3548
     * _.find(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3549
     * // => { 'name': 'fred', 'age': 40, 'blocked': true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3550
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3551
    function find(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3552
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3553
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3554
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3555
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3556
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3557
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3558
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3559
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3560
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3561
            return value;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3564
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3565
        var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3566
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3567
          if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3568
            result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3569
            return false;
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
        });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3572
        return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3577
     * This method is like `_.find` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3578
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3579
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3580
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3581
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3582
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3583
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3584
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3585
     *  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
  3586
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3587
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3588
     * @returns {*} Returns the found element, else `undefined`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3589
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3590
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3591
     * _.findLast([1, 2, 3, 4], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3592
     *   return num % 2 == 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3593
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3594
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3595
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3596
    function findLast(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3597
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3598
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3599
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3600
        if (callback(value, index, collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3601
          result = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3602
          return false;
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3605
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3609
     * Iterates over elements of a collection, executing the callback for each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3610
     * 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
  3611
     * (value, index|key, collection). Callbacks may exit iteration early by
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3612
     * explicitly returning `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3613
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3614
     * Note: As with other "Collections" methods, objects with a `length` property
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3615
     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3616
     * may be used for object iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3617
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3618
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3619
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3620
     * @alias each
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3621
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3622
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3623
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3624
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3625
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3626
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3627
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3628
     * _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3629
     * // => logs each number and returns '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3630
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3631
     * _.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
  3632
     * // => 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
  3633
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3634
    function forEach(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3635
      if (callback && typeof thisArg == 'undefined' && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3636
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3637
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3638
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3639
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3640
          if (callback(collection[index], index, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3641
            break;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3644
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3645
        baseEach(collection, callback, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3646
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3647
      return collection;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3651
     * This method is like `_.forEach` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3652
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3653
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3654
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3655
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3656
     * @alias eachRight
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3657
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3658
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3659
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3660
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3661
     * @returns {Array|Object|string} Returns `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3662
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3663
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3664
     * _([1, 2, 3]).forEachRight(function(num) { console.log(num); }).join(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3665
     * // => 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
  3666
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3667
    function forEachRight(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3668
      var iterable = collection,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3669
          length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3670
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3671
      callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3672
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3673
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3674
          if (callback(collection[length], length, collection) === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3675
            break;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3678
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3679
        if (typeof length != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3680
          var props = keys(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3681
          length = props.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3682
        } else if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3683
          iterable = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3684
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3685
        baseEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3686
          key = props ? props[--length] : --length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3687
          return callback(iterable[key], key, collection);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3690
      return collection;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3694
     * 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
  3695
     * each element of a collection through the callback. The corresponding value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3696
     * 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
  3697
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3698
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3699
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3700
     * 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
  3701
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3702
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3703
     * 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
  3704
     * 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
  3705
     * else `false`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3706
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3707
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3708
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3709
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3710
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3711
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3712
     *  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
  3713
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3714
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3715
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3716
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3717
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3718
     * _.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
  3719
     * // => { '4': [4.2], '6': [6.1, 6.4] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3720
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3721
     * _.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
  3722
     * // => { '4': [4.2], '6': [6.1, 6.4] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3723
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3724
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3725
     * _.groupBy(['one', 'two', 'three'], 'length');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3726
     * // => { '3': ['one', 'two'], '5': ['three'] }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3727
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3728
    var groupBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3729
      (hasOwnProperty.call(result, key) ? result[key] : result[key] = []).push(value);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3733
     * 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
  3734
     * each element of the collection through the given callback. The corresponding
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3735
     * 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
  3736
     * The callback is bound to `thisArg` and invoked with three arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3737
     * (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3738
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3739
     * 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
  3740
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3741
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3742
     * 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
  3743
     * 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
  3744
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3745
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3746
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3747
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3748
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3749
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3750
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3751
     *  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
  3752
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3753
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3754
     * @returns {Object} Returns the composed aggregate object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3755
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3756
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3757
     * var keys = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3758
     *   { 'dir': 'left', 'code': 97 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3759
     *   { 'dir': 'right', 'code': 100 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3762
     * _.indexBy(keys, 'dir');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3763
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3764
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3765
     * _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3766
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3767
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3768
     * _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3769
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3770
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3771
    var indexBy = createAggregator(function(result, value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3772
      result[key] = value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3776
     * 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
  3777
     * 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
  3778
     * 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
  3779
     * 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
  3780
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3781
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3782
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3783
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3784
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3785
     * @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
  3786
     *  the function invoked per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3787
     * @param {...*} [arg] Arguments to invoke the method with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3788
     * @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
  3789
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3790
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3791
     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3792
     * // => [[1, 5, 7], [1, 2, 3]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3793
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3794
     * _.invoke([123, 456], String.prototype.split, '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3795
     * // => [['1', '2', '3'], ['4', '5', '6']]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3796
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3797
    function invoke(collection, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3798
      var args = slice(arguments, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3799
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3800
          isFunc = typeof methodName == 'function',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3801
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3802
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3803
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3804
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3805
        result[++index] = (isFunc ? methodName : value[methodName]).apply(value, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3806
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3807
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3811
     * 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
  3812
     * 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
  3813
     * three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3814
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3815
     * 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
  3816
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3817
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3818
     * 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
  3819
     * 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
  3820
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3821
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3822
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3823
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3824
     * @alias collect
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3825
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3826
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3827
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3828
     *  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
  3829
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3830
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3831
     * @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
  3832
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3833
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3834
     * _.map([1, 2, 3], function(num) { return num * 3; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3835
     * // => [3, 6, 9]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3836
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3837
     * _.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
  3838
     * // => [3, 6, 9] (property order is not guaranteed across environments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3839
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3840
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3841
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3842
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3845
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3846
     * _.map(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3847
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3848
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3849
    function map(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3850
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3851
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3852
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3853
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3854
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3855
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3856
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3857
          result[index] = callback(collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3858
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3859
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3860
        baseEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3861
          result[++index] = callback(value, key, collection);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3864
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3868
     * 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
  3869
     * 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
  3870
     * 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
  3871
     * 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
  3872
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3873
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3874
     * 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
  3875
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3876
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3877
     * 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
  3878
     * 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
  3879
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3880
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3881
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3882
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3883
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3884
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3885
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3886
     *  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
  3887
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3888
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3889
     * @returns {*} Returns the maximum value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3890
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3891
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3892
     * _.max([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3893
     * // => 8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3894
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3895
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3896
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3897
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3900
     * _.max(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3901
     * // => { 'name': 'fred', 'age': 40 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3902
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3903
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3904
     * _.max(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3905
     * // => { 'name': 'fred', 'age': 40 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3906
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3907
    function max(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3908
      var computed = -Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3909
          result = computed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3910
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3911
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3912
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3913
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3914
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3915
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3916
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3917
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3918
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3919
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3920
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3921
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3922
          if (value > result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3923
            result = value;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3926
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3927
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3928
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3929
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3930
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3931
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3932
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3933
          if (current > computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3934
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3935
            result = value;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3939
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3943
     * 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
  3944
     * 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
  3945
     * 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
  3946
     * 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
  3947
     * arguments; (value, index, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3948
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3949
     * 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
  3950
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3951
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3952
     * 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
  3953
     * 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
  3954
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3955
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3956
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3957
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3958
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3959
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3960
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3961
     *  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
  3962
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3963
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3964
     * @returns {*} Returns the minimum value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3965
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3966
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3967
     * _.min([4, 2, 8, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3968
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3969
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3970
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3971
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3972
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3975
     * _.min(characters, function(chr) { return chr.age; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3976
     * // => { 'name': 'barney', 'age': 36 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3977
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3978
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3979
     * _.min(characters, 'age');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3980
     * // => { 'name': 'barney', 'age': 36 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3981
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3982
    function min(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3983
      var computed = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3984
          result = computed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3985
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3986
      // allows working with functions like `_.map` without using
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3987
      // their `index` argument as a callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3988
      if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3989
        callback = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3990
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3991
      if (callback == null && isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3992
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3993
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3994
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3995
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3996
          var value = collection[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3997
          if (value < result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3998
            result = value;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4001
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4002
        callback = (callback == null && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4003
          ? charAtCallback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4004
          : lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4005
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4006
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4007
          var current = callback(value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4008
          if (current < computed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4009
            computed = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4010
            result = value;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4014
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4018
     * 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
  4019
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4020
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4021
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4022
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4023
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4024
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4025
     * @param {string} property The name of the property to pluck.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4026
     * @returns {Array} Returns a new array of property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4027
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4028
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4029
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4030
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4031
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4034
     * _.pluck(characters, 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4035
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4036
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4037
    var pluck = map;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4040
     * 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
  4041
     * each element in the collection through the callback, where each successive
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4042
     * callback execution consumes the return value of the previous execution. If
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4043
     * `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
  4044
     * 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
  4045
     * and invoked with four arguments; (accumulator, value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4046
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4047
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4048
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4049
     * @alias foldl, inject
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4050
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4051
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4052
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4053
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4054
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4055
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4056
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4057
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4058
     * var sum = _.reduce([1, 2, 3], function(sum, num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4059
     *   return sum + num;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4060
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4061
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4062
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4063
     * 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
  4064
     *   result[key] = num * 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4065
     *   return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4066
     * }, {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4067
     * // => { 'a': 3, 'b': 6, 'c': 9 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4068
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4069
    function reduce(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4070
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4071
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4072
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4073
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4074
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4075
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4077
        if (noaccum) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4078
          accumulator = collection[++index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4079
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4080
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4081
          accumulator = callback(accumulator, collection[index], index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4082
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4083
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4084
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4085
          accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4086
            ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4087
            : callback(accumulator, value, index, collection)
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4090
      return accumulator;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4094
     * This method is like `_.reduce` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4095
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4096
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4097
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4098
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4099
     * @alias foldr
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4100
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4101
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4102
     * @param {Function} [callback=identity] The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4103
     * @param {*} [accumulator] Initial value of the accumulator.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4104
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4105
     * @returns {*} Returns the accumulated value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4106
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4107
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4108
     * var list = [[0, 1], [2, 3], [4, 5]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4109
     * var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4110
     * // => [4, 5, 2, 3, 0, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4111
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4112
    function reduceRight(collection, callback, accumulator, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4113
      var noaccum = arguments.length < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4114
      callback = lodash.createCallback(callback, thisArg, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4115
      forEachRight(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4116
        accumulator = noaccum
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4117
          ? (noaccum = false, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4118
          : callback(accumulator, value, index, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4119
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4120
      return accumulator;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4124
     * The opposite of `_.filter` this method returns the elements of a
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4125
     * collection that the callback does **not** return truey for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4126
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4127
     * 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
  4128
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4129
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4130
     * 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
  4131
     * 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
  4132
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4133
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4134
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4135
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4136
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4137
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4138
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4139
     *  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
  4140
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4141
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4142
     * @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
  4143
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4144
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4145
     * 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
  4146
     * // => [1, 3, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4147
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4148
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4149
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4150
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4153
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4154
     * _.reject(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4155
     * // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4156
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4157
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4158
     * _.reject(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4159
     * // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4160
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4161
    function reject(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4162
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4163
      return filter(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4164
        return !callback(value, index, collection);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4169
     * Retrieves a random element or `n` random elements from a collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4170
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4171
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4172
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4173
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4174
     * @param {Array|Object|string} collection The collection to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4175
     * @param {number} [n] The number of elements to sample.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4176
     * @param- {Object} [guard] Allows working with functions like `_.map`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4177
     *  without using their `index` arguments as `n`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4178
     * @returns {Array} Returns the random sample(s) of `collection`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4179
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4180
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4181
     * _.sample([1, 2, 3, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4182
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4183
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4184
     * _.sample([1, 2, 3, 4], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4185
     * // => [3, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4186
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4187
    function sample(collection, n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4188
      if (collection && typeof collection.length != 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4189
        collection = values(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4190
      } else if (support.unindexedChars && isString(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4191
        collection = collection.split('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4192
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4193
      if (n == null || guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4194
        return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4195
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4196
      var result = shuffle(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4197
      result.length = nativeMin(nativeMax(0, n), result.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4198
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4202
     * 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
  4203
     * shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4204
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4205
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4206
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4207
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4208
     * @param {Array|Object|string} collection The collection to shuffle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4209
     * @returns {Array} Returns a new shuffled collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4210
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4211
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4212
     * _.shuffle([1, 2, 3, 4, 5, 6]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4213
     * // => [4, 1, 6, 3, 5, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4214
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4215
    function shuffle(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4216
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4217
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4218
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4219
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4220
      forEach(collection, function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4221
        var rand = baseRandom(0, ++index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4222
        result[index] = result[rand];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4223
        result[rand] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4224
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4225
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4229
     * 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
  4230
     * 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
  4231
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4232
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4233
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4234
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4235
     * @param {Array|Object|string} collection The collection to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4236
     * @returns {number} Returns `collection.length` or number of own enumerable properties.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4237
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4238
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4239
     * _.size([1, 2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4240
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4241
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4242
     * _.size({ 'one': 1, 'two': 2, 'three': 3 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4243
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4244
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4245
     * _.size('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4246
     * // => 7
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4247
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4248
    function size(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4249
      var length = collection ? collection.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4250
      return typeof length == 'number' ? length : keys(collection).length;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4254
     * 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
  4255
     * 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
  4256
     * 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
  4257
     * `thisArg` and invoked with three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4258
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4259
     * 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
  4260
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4261
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4262
     * 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
  4263
     * 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
  4264
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4265
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4266
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4267
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4268
     * @alias any
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4269
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4270
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4271
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4272
     *  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
  4273
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4274
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4275
     * @returns {boolean} Returns `true` if any element passed the callback check,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4276
     *  else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4277
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4278
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4279
     * _.some([null, 0, 'yes', false], Boolean);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4280
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4281
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4282
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4283
     *   { 'name': 'barney', 'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4284
     *   { 'name': 'fred',   'age': 40, 'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4287
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4288
     * _.some(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4289
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4290
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4291
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4292
     * _.some(characters, { 'age': 1 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4293
     * // => false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4294
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4295
    function some(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4296
      var result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4297
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4298
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4299
      if (isArray(collection)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4300
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4301
            length = collection.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4302
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4303
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4304
          if ((result = callback(collection[index], index, collection))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4305
            break;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4308
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4309
        baseEach(collection, function(value, index, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4310
          return !(result = callback(value, index, collection));
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4313
      return !!result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4317
     * 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
  4318
     * running each element in a collection through the callback. This method
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4319
     * 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
  4320
     * 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
  4321
     * three arguments; (value, index|key, collection).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4322
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4323
     * 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
  4324
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4325
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4326
     * 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
  4327
     * will be sorted by each property value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4328
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4329
     * If an object is provided for `callback` the created "_.where" style callback
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4330
     * 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
  4331
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4332
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4333
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4334
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4335
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4336
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4337
     * @param {Array|Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4338
     *  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
  4339
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4340
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4341
     * @returns {Array} Returns a new array of sorted elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4342
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4343
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4344
     * _.sortBy([1, 2, 3], function(num) { return Math.sin(num); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4345
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4346
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4347
     * _.sortBy([1, 2, 3], function(num) { return this.sin(num); }, Math);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4348
     * // => [3, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4349
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4350
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4351
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4352
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4353
     *   { 'name': 'barney',  'age': 26 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4354
     *   { 'name': 'fred',    'age': 30 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4357
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4358
     * _.map(_.sortBy(characters, 'age'), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4359
     * // => [['barney', 26], ['fred', 30], ['barney', 36], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4360
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4361
     * // sorting by multiple properties
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4362
     * _.map(_.sortBy(characters, ['name', 'age']), _.values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4363
     * // = > [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4364
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4365
    function sortBy(collection, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4366
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4367
          isArr = isArray(callback),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4368
          length = collection ? collection.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4369
          result = Array(typeof length == 'number' ? length : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4370
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4371
      if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4372
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4373
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4374
      forEach(collection, function(value, key, collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4375
        var object = result[++index] = getObject();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4376
        if (isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4377
          object.criteria = map(callback, function(key) { return value[key]; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4378
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4379
          (object.criteria = getArray())[0] = callback(value, key, collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4380
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4381
        object.index = index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4382
        object.value = value;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4385
      length = result.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4386
      result.sort(compareAscending);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4387
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4388
        var object = result[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4389
        result[length] = object.value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4390
        if (!isArr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4391
          releaseArray(object.criteria);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4392
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4393
        releaseObject(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4394
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4395
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4399
     * Converts the `collection` to an array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4400
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4401
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4402
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4403
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4404
     * @param {Array|Object|string} collection The collection to convert.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4405
     * @returns {Array} Returns the new converted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4406
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4407
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4408
     * (function() { return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4409
     * // => [2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4410
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4411
    function toArray(collection) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4412
      if (collection && typeof collection.length == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4413
        return (support.unindexedChars && isString(collection))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4414
          ? collection.split('')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4415
          : slice(collection);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4416
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4417
      return values(collection);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4421
     * 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
  4422
     * `properties` object, returning an array of all elements that have equivalent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4423
     * property values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4424
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4425
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4426
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4427
     * @type Function
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4428
     * @category Collections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4429
     * @param {Array|Object|string} collection The collection to iterate over.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4430
     * @param {Object} props The object of property values to filter by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4431
     * @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
  4432
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4433
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4434
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4435
     *   { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4436
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4439
     * _.where(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4440
     * // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4441
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4442
     * _.where(characters, { 'pets': ['dino'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4443
     * // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4444
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4445
    var where = filter;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4450
     * 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
  4451
     * `0`, `""`, `undefined`, and `NaN` are all falsey.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4452
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4453
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4454
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4455
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4456
     * @param {Array} array The array to compact.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4457
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4458
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4459
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4460
     * _.compact([0, 1, false, 2, '', 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4461
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4462
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4463
    function compact(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4464
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4465
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4466
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4467
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4468
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4469
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4470
        if (value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4471
          result.push(value);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4474
      return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4475
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4476
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4477
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4478
     * Creates an array excluding all values of the provided arrays using strict
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4479
     * equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4480
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4481
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4482
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4483
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4484
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4485
     * @param {...Array} [values] The arrays of values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4486
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4487
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4488
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4489
     * _.difference([1, 2, 3, 4, 5], [5, 2, 10]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4490
     * // => [1, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4491
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4492
    function difference(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4493
      return baseDifference(array, baseFlatten(arguments, true, true, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4497
     * 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
  4498
     * element that passes the callback check, instead of the element itself.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4499
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4500
     * 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
  4501
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4502
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4503
     * 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
  4504
     * 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
  4505
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4506
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4507
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4508
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4509
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4510
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4511
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4512
     *  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
  4513
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4514
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4515
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4516
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4517
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4518
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4519
     *   { 'name': 'barney',  'age': 36, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4520
     *   { 'name': 'fred',    'age': 40, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4521
     *   { 'name': 'pebbles', 'age': 1,  'blocked': false }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4524
     * _.findIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4525
     *   return chr.age < 20;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4526
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4527
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4528
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4529
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4530
     * _.findIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4531
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4532
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4533
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4534
     * _.findIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4535
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4536
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4537
    function findIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4538
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4539
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4540
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4541
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4542
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4543
        if (callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4544
          return index;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4547
      return -1;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4551
     * This method is like `_.findIndex` except that it iterates over elements
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4552
     * of a `collection` from right to left.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4553
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4554
     * 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
  4555
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4556
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4557
     * 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
  4558
     * 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
  4559
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4560
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4561
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4562
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4563
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4564
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4565
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4566
     *  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
  4567
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4568
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4569
     * @returns {number} Returns the index of the found element, else `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4570
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4571
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4572
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4573
     *   { 'name': 'barney',  'age': 36, 'blocked': true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4574
     *   { 'name': 'fred',    'age': 40, 'blocked': false },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4575
     *   { 'name': 'pebbles', 'age': 1,  'blocked': true }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4578
     * _.findLastIndex(characters, function(chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4579
     *   return chr.age > 30;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4580
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4581
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4582
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4583
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4584
     * _.findLastIndex(characters, { 'age': 36 });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4585
     * // => 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4586
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4587
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4588
     * _.findLastIndex(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4589
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4590
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4591
    function findLastIndex(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4592
      var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4593
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4594
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4595
        if (callback(array[length], length, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4596
          return length;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4599
      return -1;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4603
     * 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
  4604
     * 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
  4605
     * 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
  4606
     * invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4607
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4608
     * 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
  4609
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4610
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4611
     * 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
  4612
     * 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
  4613
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4614
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4615
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4616
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4617
     * @alias head, take
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4618
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4619
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4620
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4621
     *  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
  4622
     *  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
  4623
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4624
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4625
     * @returns {*} Returns the first element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4626
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4627
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4628
     * _.first([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4629
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4630
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4631
     * _.first([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4632
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4633
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4634
     * _.first([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4635
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4636
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4637
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4638
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4639
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4640
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4641
     *   { 'name': 'fred',    'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4642
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4645
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4646
     * _.first(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4647
     * // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4648
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4649
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4650
     * _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4651
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4652
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4653
    function first(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4654
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4655
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4656
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4657
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4658
        var index = -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4659
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4660
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4661
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4662
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4663
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4664
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4665
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4666
          return array ? array[0] : undefined;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4669
      return slice(array, 0, nativeMin(nativeMax(0, n), length));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4673
     * 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
  4674
     * 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
  4675
     * 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
  4676
     * flattening. The callback is bound to `thisArg` and invoked with three
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4677
     * arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4678
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4679
     * 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
  4680
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4681
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4682
     * 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
  4683
     * 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
  4684
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4685
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4686
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4687
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4688
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4689
     * @param {Array} array The array to flatten.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4690
     * @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
  4691
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4692
     *  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
  4693
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4694
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4695
     * @returns {Array} Returns a new flattened array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4696
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4697
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4698
     * _.flatten([1, [2], [3, [[4]]]]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4699
     * // => [1, 2, 3, 4];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4700
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4701
     * _.flatten([1, [2], [3, [[4]]]], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4702
     * // => [1, 2, 3, [[4]]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4703
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4704
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4705
     *   { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4706
     *   { 'name': 'fred',   'age': 40, 'pets': ['baby puss', 'dino'] }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4709
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4710
     * _.flatten(characters, 'pets');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4711
     * // => ['hoppy', 'baby puss', 'dino']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4712
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4713
    function flatten(array, isShallow, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4714
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4715
      if (typeof isShallow != 'boolean' && isShallow != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4716
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4717
        callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4718
        isShallow = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4719
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4720
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4721
        array = map(array, callback, thisArg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4722
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4723
      return baseFlatten(array, isShallow);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4727
     * 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
  4728
     * 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
  4729
     * providing `true` for `fromIndex` will run a faster binary search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4730
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4731
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4732
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4733
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4734
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4735
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4736
     * @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
  4737
     *  to perform a binary search on a sorted array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4738
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4739
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4740
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4741
     * _.indexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4742
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4743
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4744
     * _.indexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4745
     * // => 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4746
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4747
     * _.indexOf([1, 1, 2, 2, 3, 3], 2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4748
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4749
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4750
    function indexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4751
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4752
        var length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4753
        fromIndex = (fromIndex < 0 ? nativeMax(0, length + fromIndex) : fromIndex || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4754
      } else if (fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4755
        var index = sortedIndex(array, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4756
        return array[index] === value ? index : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4757
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4758
      return baseIndexOf(array, value, fromIndex);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4762
     * 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
  4763
     * 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
  4764
     * 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
  4765
     * to `thisArg` and invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4766
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4767
     * 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
  4768
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4769
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4770
     * 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
  4771
     * 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
  4772
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4773
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4774
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4775
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4776
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4777
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4778
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4779
     *  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
  4780
     *  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
  4781
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4782
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4783
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4784
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4785
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4786
     * _.initial([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4787
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4788
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4789
     * _.initial([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4790
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4791
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4792
     * _.initial([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4793
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4794
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4795
     * // => [1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4796
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4797
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4798
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4799
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4800
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4803
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4804
     * _.initial(characters, 'blocked');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4805
     * // => [{ 'name': 'barney',  'blocked': false, 'employer': 'slate' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4806
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4807
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4808
     * _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4809
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4810
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4811
    function initial(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4812
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4813
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4814
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4815
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4816
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4817
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4818
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4819
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4820
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4821
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4822
        n = (callback == null || thisArg) ? 1 : callback || n;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4823
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4824
      return slice(array, 0, nativeMin(nativeMax(0, length - n), length));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4828
     * 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
  4829
     * strict equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4830
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4831
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4832
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4833
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4834
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4835
     * @returns {Array} Returns an array of shared values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4836
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4837
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4838
     * _.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4839
     * // => [1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4840
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4841
    function intersection() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4842
      var args = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4843
          argsIndex = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4844
          argsLength = arguments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4845
          caches = getArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4846
          indexOf = getIndexOf(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4847
          trustIndexOf = indexOf === baseIndexOf,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4848
          seen = getArray();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4849
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4850
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4851
        var value = arguments[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4852
        if (isArray(value) || isArguments(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4853
          args.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4854
          caches.push(trustIndexOf && value.length >= largeArraySize &&
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4855
            createCache(argsIndex ? args[argsIndex] : seen));
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4858
      var array = args[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4859
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4860
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4861
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4862
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4863
      outer:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4864
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4865
        var cache = caches[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4866
        value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4867
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4868
        if ((cache ? cacheIndexOf(cache, value) : indexOf(seen, value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4869
          argsIndex = argsLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4870
          (cache || seen).push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4871
          while (--argsIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4872
            cache = caches[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4873
            if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value)) < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4874
              continue outer;
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
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4877
          result.push(value);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4880
      while (argsLength--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4881
        cache = caches[argsLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4882
        if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4883
          releaseObject(cache);
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4886
      releaseArray(caches);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4887
      releaseArray(seen);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4888
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4892
     * 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
  4893
     * 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
  4894
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4895
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4896
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4897
     * 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
  4898
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4899
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4900
     * 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
  4901
     * 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
  4902
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4903
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4904
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4905
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4906
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4907
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4908
     * @param {Function|Object|number|string} [callback] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4909
     *  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
  4910
     *  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
  4911
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4912
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4913
     * @returns {*} Returns the last element(s) of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4914
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4915
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4916
     * _.last([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4917
     * // => 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4918
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4919
     * _.last([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4920
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4921
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4922
     * _.last([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4923
     *   return num > 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4924
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4925
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4926
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4927
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4928
     *   { 'name': 'barney',  'blocked': false, 'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4929
     *   { 'name': 'fred',    'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4930
     *   { 'name': 'pebbles', 'blocked': true,  'employer': 'na' }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4933
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4934
     * _.pluck(_.last(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4935
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4936
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4937
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4938
     * _.last(characters, { 'employer': 'na' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4939
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4940
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4941
    function last(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4942
      var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4943
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4944
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4945
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4946
        var index = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4947
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4948
        while (index-- && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4949
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4950
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4951
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4952
        n = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4953
        if (n == null || thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4954
          return array ? array[length - 1] : undefined;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4957
      return slice(array, nativeMax(0, length - n));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4961
     * 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
  4962
     * 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
  4963
     * as the offset from the end of the collection.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4964
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4965
     * 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
  4966
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4967
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4968
     * 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
  4969
     * 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
  4970
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4971
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4972
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4973
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4974
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4975
     * @param {Array} array The array to search.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4976
     * @param {*} value The value to search for.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4977
     * @param {number} [fromIndex=array.length-1] The index to search from.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4978
     * @returns {number} Returns the index of the matched value or `-1`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4979
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4980
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4981
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4982
     * // => 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4983
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4984
     * _.lastIndexOf([1, 2, 3, 1, 2, 3], 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4985
     * // => 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4986
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4987
    function lastIndexOf(array, value, fromIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4988
      var index = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4989
      if (typeof fromIndex == 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4990
        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
  4991
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4992
      while (index--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4993
        if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4994
          return index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4995
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4996
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4997
      return -1;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5001
     * 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
  5002
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5003
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5004
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5005
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5006
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5007
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5008
     * @param {...*} [value] The values to remove.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5009
     * @returns {Array} Returns `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5010
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5011
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5012
     * var array = [1, 2, 3, 1, 2, 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5013
     * _.pull(array, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5014
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5015
     * // => [1, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5016
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5017
    function pull(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5018
      var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5019
          argsIndex = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5020
          argsLength = args.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5021
          length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5022
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5023
      while (++argsIndex < argsLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5024
        var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5025
            value = args[argsIndex];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5026
        while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5027
          if (array[index] === value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5028
            splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5029
            length--;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5033
      return array;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5037
     * Creates an array of numbers (positive and/or negative) progressing from
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5038
     * `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
  5039
     * zero-length range is created unless a negative `step` is specified.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5040
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5041
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5042
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5043
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5044
     * @param {number} [start=0] The start of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5045
     * @param {number} end The end of the range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5046
     * @param {number} [step=1] The value to increment or decrement by.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5047
     * @returns {Array} Returns a new range array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5048
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5049
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5050
     * _.range(4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5051
     * // => [0, 1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5052
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5053
     * _.range(1, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5054
     * // => [1, 2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5055
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5056
     * _.range(0, 20, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5057
     * // => [0, 5, 10, 15]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5058
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5059
     * _.range(0, -4, -1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5060
     * // => [0, -1, -2, -3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5061
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5062
     * _.range(1, 4, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5063
     * // => [1, 1, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5064
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5065
     * _.range(0);
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
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5068
    function range(start, end, step) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5069
      start = +start || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5070
      step = typeof step == 'number' ? step : (+step || 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5071
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5072
      if (end == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5073
        end = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5074
        start = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5075
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5076
      // 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
  5077
      // http://youtu.be/XAqIpGU8ZZk#t=17m25s
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5078
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5079
          length = nativeMax(0, ceil((end - start) / (step || 1))),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5080
          result = Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5081
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5082
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5083
        result[index] = start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5084
        start += step;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5085
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5086
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5090
     * 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
  5091
     * 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
  5092
     * and invoked with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5093
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5094
     * 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
  5095
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5096
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5097
     * 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
  5098
     * 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
  5099
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5100
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5101
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5102
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5103
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5104
     * @param {Array} array The array to modify.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5105
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5106
     *  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
  5107
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5108
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5109
     * @returns {Array} Returns a new array of removed elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5110
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5111
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5112
     * var array = [1, 2, 3, 4, 5, 6];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5113
     * var evens = _.remove(array, function(num) { return num % 2 == 0; });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5114
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5115
     * console.log(array);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5116
     * // => [1, 3, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5117
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5118
     * console.log(evens);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5119
     * // => [2, 4, 6]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5120
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5121
    function remove(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5122
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5123
          length = array ? array.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5124
          result = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5125
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5126
      callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5127
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5128
        var value = array[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5129
        if (callback(value, index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5130
          result.push(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5131
          splice.call(array, index--, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5132
          length--;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5135
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5139
     * 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
  5140
     * 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
  5141
     * 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
  5142
     * callback returns truey. The callback is bound to `thisArg` and invoked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5143
     * with three arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5144
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5145
     * 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
  5146
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5147
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5148
     * 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
  5149
     * 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
  5150
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5151
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5152
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5153
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5154
     * @alias drop, tail
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5155
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5156
     * @param {Array} array The array to query.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5157
     * @param {Function|Object|number|string} [callback=1] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5158
     *  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
  5159
     *  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
  5160
     *  style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5161
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5162
     * @returns {Array} Returns a slice of `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5163
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5164
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5165
     * _.rest([1, 2, 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5166
     * // => [2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5167
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5168
     * _.rest([1, 2, 3], 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5169
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5170
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5171
     * _.rest([1, 2, 3], function(num) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5172
     *   return num < 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5173
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5174
     * // => [3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5175
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5176
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5177
     *   { 'name': 'barney',  'blocked': true,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5178
     *   { 'name': 'fred',    'blocked': false,  'employer': 'slate' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5179
     *   { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5182
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5183
     * _.pluck(_.rest(characters, 'blocked'), 'name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5184
     * // => ['fred', 'pebbles']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5185
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5186
     * // using "_.where" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5187
     * _.rest(characters, { 'employer': 'slate' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5188
     * // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5189
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5190
    function rest(array, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5191
      if (typeof callback != 'number' && callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5192
        var n = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5193
            index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5194
            length = array ? array.length : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5195
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5196
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5197
        while (++index < length && callback(array[index], index, array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5198
          n++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5199
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5200
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5201
        n = (callback == null || thisArg) ? 1 : nativeMax(0, callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5202
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5203
      return slice(array, n);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5207
     * 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
  5208
     * 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
  5209
     * 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
  5210
     * `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
  5211
     * callback is bound to `thisArg` and invoked with one argument; (value).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5212
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5213
     * 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
  5214
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5215
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5216
     * 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
  5217
     * 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
  5218
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5219
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5220
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5221
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5222
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5223
     * @param {Array} array The array to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5224
     * @param {*} value The value to evaluate.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5225
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5226
     *  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
  5227
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5228
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5229
     * @returns {number} Returns the index at which `value` should be inserted
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5230
     *  into `array`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5231
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5232
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5233
     * _.sortedIndex([20, 30, 50], 40);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5234
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5235
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5236
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5237
     * _.sortedIndex([{ 'x': 20 }, { 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5238
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5239
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5240
     * var dict = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5241
     *   'wordToNumber': { 'twenty': 20, 'thirty': 30, 'fourty': 40, 'fifty': 50 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5242
     * };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5243
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5244
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5245
     *   return dict.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5246
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5247
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5248
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5249
     * _.sortedIndex(['twenty', 'thirty', 'fifty'], 'fourty', function(word) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5250
     *   return this.wordToNumber[word];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5251
     * }, dict);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5252
     * // => 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5253
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5254
    function sortedIndex(array, value, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5255
      var low = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5256
          high = array ? array.length : low;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5257
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5258
      // explicitly reference `identity` for better inlining in Firefox
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5259
      callback = callback ? lodash.createCallback(callback, thisArg, 1) : identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5260
      value = callback(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5261
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5262
      while (low < high) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5263
        var mid = (low + high) >>> 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5264
        (callback(array[mid]) < value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5265
          ? low = mid + 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5266
          : high = mid;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5267
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5268
      return low;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5272
     * 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
  5273
     * strict equality for comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5274
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5275
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5276
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5277
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5278
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5279
     * @returns {Array} Returns an array of combined values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5280
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5281
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5282
     * _.union([1, 2, 3], [5, 2, 1, 4], [2, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5283
     * // => [1, 2, 3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5284
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5285
    function union() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5286
      return baseUniq(baseFlatten(arguments, true, true));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5290
     * 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
  5291
     * for comparisons, i.e. `===`. If the array is sorted, providing
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5292
     * `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
  5293
     * each element of `array` is passed through the callback before uniqueness
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5294
     * 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
  5295
     * arguments; (value, index, array).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5296
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5297
     * 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
  5298
     * callback will return the property value of the given element.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5299
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5300
     * 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
  5301
     * 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
  5302
     * else `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5303
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5304
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5305
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5306
     * @alias unique
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5307
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5308
     * @param {Array} array The array to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5309
     * @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
  5310
     * @param {Function|Object|string} [callback=identity] The function called
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5311
     *  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
  5312
     *  to create a "_.pluck" or "_.where" style callback, respectively.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5313
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5314
     * @returns {Array} Returns a duplicate-value-free array.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5315
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5316
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5317
     * _.uniq([1, 2, 1, 3, 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5318
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5319
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5320
     * _.uniq([1, 1, 2, 2, 3], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5321
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5322
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5323
     * _.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
  5324
     * // => ['A', 'b', 'C']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5325
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5326
     * _.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
  5327
     * // => [1, 2.5, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5328
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5329
     * // using "_.pluck" callback shorthand
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5330
     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5331
     * // => [{ 'x': 1 }, { 'x': 2 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5332
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5333
    function uniq(array, isSorted, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5334
      // juggle arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5335
      if (typeof isSorted != 'boolean' && isSorted != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5336
        thisArg = callback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5337
        callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5338
        isSorted = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5339
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5340
      if (callback != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5341
        callback = lodash.createCallback(callback, thisArg, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5342
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5343
      return baseUniq(array, isSorted, callback);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5347
     * Creates an array excluding all provided values using strict equality for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5348
     * comparisons, i.e. `===`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5349
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5350
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5351
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5352
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5353
     * @param {Array} array The array to filter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5354
     * @param {...*} [value] The values to exclude.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5355
     * @returns {Array} Returns a new array of filtered values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5356
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5357
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5358
     * _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5359
     * // => [2, 3, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5360
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5361
    function without(array) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5362
      return baseDifference(array, slice(arguments, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5366
     * 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
  5367
     * See http://en.wikipedia.org/wiki/Symmetric_difference.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5368
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5369
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5370
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5371
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5372
     * @param {...Array} [array] The arrays to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5373
     * @returns {Array} Returns an array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5374
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5375
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5376
     * _.xor([1, 2, 3], [5, 2, 1, 4]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5377
     * // => [3, 5, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5378
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5379
     * _.xor([1, 2, 5], [2, 3, 5], [3, 4, 5]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5380
     * // => [1, 4, 5]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5381
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5382
    function xor() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5383
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5384
          length = arguments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5385
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5386
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5387
        var array = arguments[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5388
        if (isArray(array) || isArguments(array)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5389
          var result = result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5390
            ? baseUniq(baseDifference(result, array).concat(baseDifference(array, result)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5391
            : array;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5394
      return result || [];
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5398
     * 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
  5399
     * 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
  5400
     * elements of the given arrays, and so on.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5401
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5402
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5403
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5404
     * @alias unzip
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5405
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5406
     * @param {...Array} [array] Arrays to process.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5407
     * @returns {Array} Returns a new array of grouped elements.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5408
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5409
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5410
     * _.zip(['fred', 'barney'], [30, 40], [true, false]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5411
     * // => [['fred', 30, true], ['barney', 40, false]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5412
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5413
    function zip() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5414
      var array = arguments.length > 1 ? arguments : arguments[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5415
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5416
          length = array ? max(pluck(array, 'length')) : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5417
          result = Array(length < 0 ? 0 : length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5418
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5419
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5420
        result[index] = pluck(array, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5421
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5422
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5426
     * Creates an object composed from arrays of `keys` and `values`. Provide
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5427
     * 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
  5428
     * or two arrays, one of `keys` and one of corresponding `values`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5429
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5430
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5431
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5432
     * @alias object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5433
     * @category Arrays
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5434
     * @param {Array} keys The array of keys.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5435
     * @param {Array} [values=[]] The array of values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5436
     * @returns {Object} Returns an object composed of the given keys and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5437
     *  corresponding values.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5438
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5439
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5440
     * _.zipObject(['fred', 'barney'], [30, 40]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5441
     * // => { 'fred': 30, 'barney': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5442
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5443
    function zipObject(keys, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5444
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5445
          length = keys ? keys.length : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5446
          result = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5447
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5448
      if (!values && length && !isArray(keys[0])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5449
        values = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5450
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5451
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5452
        var key = keys[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5453
        if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5454
          result[key] = values[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5455
        } else if (key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5456
          result[key[0]] = key[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5457
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5458
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5459
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5465
     * Creates a function that executes `func`, with  the `this` binding and
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5466
     * arguments of the created function, only after being called `n` times.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5467
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5468
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5469
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5470
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5471
     * @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
  5472
     *  `func` is executed.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5473
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5474
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5475
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5476
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5477
     * var saves = ['profile', 'settings'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5478
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5479
     * var done = _.after(saves.length, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5480
     *   console.log('Done saving!');
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5483
     * _.forEach(saves, function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5484
     *   asyncSave({ 'type': type, 'complete': done });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5485
     * });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5486
     * // => logs 'Done saving!', after all saves have completed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5487
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5488
    function after(n, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5489
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5490
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5491
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5492
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5493
        if (--n < 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5494
          return func.apply(this, arguments);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5500
     * Creates a function that, when called, invokes `func` with the `this`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5501
     * binding of `thisArg` and prepends any additional `bind` arguments to those
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5502
     * provided to the bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5503
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5504
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5505
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5506
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5507
     * @param {Function} func The function to bind.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5508
     * @param {*} [thisArg] The `this` binding of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5509
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5510
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5511
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5512
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5513
     * var func = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5514
     *   return greeting + ' ' + this.name;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5517
     * func = _.bind(func, { 'name': 'fred' }, 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5518
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5519
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5520
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5521
    function bind(func, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5522
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5523
        ? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5524
        : createWrapper(func, 1, null, null, thisArg);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5528
     * 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
  5529
     * 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
  5530
     * 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
  5531
     * of `object` will be bound.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5532
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5533
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5534
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5535
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5536
     * @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
  5537
     * @param {...string} [methodName] The object method names to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5538
     *  bind, specified as individual method names or arrays of method names.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5539
     * @returns {Object} Returns `object`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5540
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5541
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5542
     * var view = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5543
     *   'label': 'docs',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5544
     *   'onClick': function() { console.log('clicked ' + this.label); }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5547
     * _.bindAll(view);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5548
     * jQuery('#docs').on('click', view.onClick);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5549
     * // => logs 'clicked docs', when the button is clicked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5550
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5551
    function bindAll(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5552
      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
  5553
          index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5554
          length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5555
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5556
      while (++index < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5557
        var key = funcs[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5558
        object[key] = createWrapper(object[key], 1, null, null, object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5559
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5560
      return object;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5564
     * 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
  5565
     * 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
  5566
     * function. This method differs from `_.bind` by allowing bound functions to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5567
     * reference methods that will be redefined or don't yet exist.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5568
     * See http://michaux.ca/articles/lazy-function-definition-pattern.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5569
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5570
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5571
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5572
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5573
     * @param {Object} object The object the method belongs to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5574
     * @param {string} key The key of the method.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5575
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5576
     * @returns {Function} Returns the new bound function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5577
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5578
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5579
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5580
     *   'name': 'fred',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5581
     *   'greet': function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5582
     *     return greeting + ' ' + this.name;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5586
     * var func = _.bindKey(object, 'greet', 'hi');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5587
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5588
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5589
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5590
     * object.greet = function(greeting) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5591
     *   return greeting + 'ya ' + this.name + '!';
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5594
     * func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5595
     * // => 'hiya fred!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5596
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5597
    function bindKey(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5598
      return arguments.length > 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5599
        ? createWrapper(key, 19, slice(arguments, 2), null, object)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5600
        : createWrapper(key, 3, null, null, object);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5604
     * Creates a function that is the composition of the provided functions,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5605
     * 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
  5606
     * 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
  5607
     * 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
  5608
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5609
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5610
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5611
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5612
     * @param {...Function} [func] Functions to compose.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5613
     * @returns {Function} Returns the new composed function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5614
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5615
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5616
     * var realNameMap = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5617
     *   'pebbles': 'penelope'
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5620
     * var format = function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5621
     *   name = realNameMap[name.toLowerCase()] || name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5622
     *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase();
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5625
     * var greet = function(formatted) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5626
     *   return 'Hiya ' + formatted + '!';
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5629
     * var welcome = _.compose(greet, format);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5630
     * welcome('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5631
     * // => 'Hiya Penelope!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5632
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5633
    function compose() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5634
      var funcs = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5635
          length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5636
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5637
      while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5638
        if (!isFunction(funcs[length])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5639
          throw new TypeError;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5642
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5643
        var args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5644
            length = funcs.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5645
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5646
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5647
          args = [funcs[length].apply(this, args)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5648
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5649
        return args[0];
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5654
     * 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
  5655
     * invoked either executes `func` returning its result, if all `func` arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5656
     * 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
  5657
     * 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
  5658
     * if `func.length` is not sufficient.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5659
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5660
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5661
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5662
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5663
     * @param {Function} func The function to curry.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5664
     * @param {number} [arity=func.length] The arity of `func`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5665
     * @returns {Function} Returns the new curried function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5666
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5667
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5668
     * var curried = _.curry(function(a, b, c) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5669
     *   console.log(a + b + c);
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5672
     * curried(1)(2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5673
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5674
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5675
     * curried(1, 2)(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5676
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5677
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5678
     * curried(1, 2, 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5679
     * // => 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5680
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5681
    function curry(func, arity) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5682
      arity = typeof arity == 'number' ? arity : (+arity || func.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5683
      return createWrapper(func, 4, null, null, null, arity);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5687
     * 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
  5688
     * `wait` milliseconds have elapsed since the last time it was invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5689
     * 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
  5690
     * 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
  5691
     * 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
  5692
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5693
     * 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
  5694
     * 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
  5695
     * invoked more than once during the `wait` timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5696
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5697
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5698
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5699
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5700
     * @param {Function} func The function to debounce.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5701
     * @param {number} wait The number of milliseconds to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5702
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5703
     * @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
  5704
     * @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
  5705
     * @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
  5706
     * @returns {Function} Returns the new debounced function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5707
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5708
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5709
     * // avoid costly calculations while the window size is in flux
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5710
     * var lazyLayout = _.debounce(calculateLayout, 150);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5711
     * jQuery(window).on('resize', lazyLayout);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5712
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5713
     * // execute `sendMail` when the click event is fired, debouncing subsequent calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5714
     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5715
     *   'leading': true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5716
     *   'trailing': false
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5719
     * // ensure `batchLog` is executed once after 1 second of debounced calls
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5720
     * var source = new EventSource('/stream');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5721
     * source.addEventListener('message', _.debounce(batchLog, 250, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5722
     *   'maxWait': 1000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5723
     * }, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5724
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5725
    function debounce(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5726
      var args,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5727
          maxTimeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5728
          result,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5729
          stamp,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5730
          thisArg,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5731
          timeoutId,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5732
          trailingCall,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5733
          lastCalled = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5734
          maxWait = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5735
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5736
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5737
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5738
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5739
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5740
      wait = nativeMax(0, wait) || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5741
      if (options === true) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5742
        var leading = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5743
        trailing = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5744
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5745
        leading = options.leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5746
        maxWait = 'maxWait' in options && (nativeMax(wait, options.maxWait) || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5747
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5748
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5749
      var delayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5750
        var remaining = wait - (now() - stamp);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5751
        if (remaining <= 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5752
          if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5753
            clearTimeout(maxTimeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5754
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5755
          var isCalled = trailingCall;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5756
          maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5757
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5758
            lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5759
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5760
            if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5761
              args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5762
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5763
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5764
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5765
          timeoutId = setTimeout(delayed, remaining);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5769
      var maxDelayed = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5770
        if (timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5771
          clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5772
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5773
        maxTimeoutId = timeoutId = trailingCall = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5774
        if (trailing || (maxWait !== wait)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5775
          lastCalled = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5776
          result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5777
          if (!timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5778
            args = thisArg = null;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5783
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5784
        args = arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5785
        stamp = now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5786
        thisArg = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5787
        trailingCall = trailing && (timeoutId || !leading);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5788
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5789
        if (maxWait === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5790
          var leadingCall = leading && !timeoutId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5791
        } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5792
          if (!maxTimeoutId && !leading) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5793
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5794
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5795
          var remaining = maxWait - (stamp - lastCalled),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5796
              isCalled = remaining <= 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5797
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5798
          if (isCalled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5799
            if (maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5800
              maxTimeoutId = clearTimeout(maxTimeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5801
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5802
            lastCalled = stamp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5803
            result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5804
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5805
          else if (!maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5806
            maxTimeoutId = setTimeout(maxDelayed, remaining);
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5809
        if (isCalled && timeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5810
          timeoutId = clearTimeout(timeoutId);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5811
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5812
        else if (!timeoutId && wait !== maxWait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5813
          timeoutId = setTimeout(delayed, wait);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5814
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5815
        if (leadingCall) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5816
          isCalled = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5817
          result = func.apply(thisArg, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5818
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5819
        if (isCalled && !timeoutId && !maxTimeoutId) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5820
          args = thisArg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5821
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5822
        return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5827
     * 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
  5828
     * Additional arguments will be provided to `func` when it is invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5829
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5830
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5831
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5832
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5833
     * @param {Function} func The function to defer.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5834
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5835
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5836
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5837
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5838
     * _.defer(function(text) { console.log(text); }, 'deferred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5839
     * // logs 'deferred' after one or more milliseconds
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5840
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5841
    function defer(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5842
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5843
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5844
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5845
      var args = slice(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5846
      return setTimeout(function() { func.apply(undefined, args); }, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5847
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5848
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5849
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5850
     * Executes the `func` function after `wait` milliseconds. Additional arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5851
     * will be provided to `func` when it is invoked.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5852
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5853
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5854
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5855
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5856
     * @param {Function} func The function to delay.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5857
     * @param {number} wait The number of milliseconds to delay execution.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5858
     * @param {...*} [arg] Arguments to invoke the function with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5859
     * @returns {number} Returns the timer id.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5860
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5861
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5862
     * _.delay(function(text) { console.log(text); }, 1000, 'later');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5863
     * // => logs 'later' after one second
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5864
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5865
    function delay(func, wait) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5866
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5867
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5868
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5869
      var args = slice(arguments, 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5870
      return setTimeout(function() { func.apply(undefined, args); }, wait);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5874
     * 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
  5875
     * 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
  5876
     * 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
  5877
     * 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
  5878
     * 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
  5879
     * 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
  5880
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5881
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5882
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5883
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5884
     * @param {Function} func The function to have its output memoized.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5885
     * @param {Function} [resolver] A function used to resolve the cache key.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5886
     * @returns {Function} Returns the new memoizing function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5887
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5888
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5889
     * var fibonacci = _.memoize(function(n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5890
     *   return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5893
     * fibonacci(9)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5894
     * // => 34
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5895
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5896
     * var data = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5897
     *   'fred': { 'name': 'fred', 'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5898
     *   'pebbles': { 'name': 'pebbles', 'age': 1 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5901
     * // modifying the result cache
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5902
     * var get = _.memoize(function(name) { return data[name]; }, _.identity);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5903
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5904
     * // => { 'name': 'pebbles', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5905
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5906
     * get.cache.pebbles.name = 'penelope';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5907
     * get('pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5908
     * // => { 'name': 'penelope', 'age': 1 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5909
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5910
    function memoize(func, resolver) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5911
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5912
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5913
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5914
      var memoized = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5915
        var cache = memoized.cache,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5916
            key = resolver ? resolver.apply(this, arguments) : keyPrefix + arguments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5917
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5918
        return hasOwnProperty.call(cache, key)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5919
          ? cache[key]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5920
          : (cache[key] = func.apply(this, arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5921
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5922
      memoized.cache = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5923
      return memoized;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5927
     * 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
  5928
     * 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
  5929
     * with the `this` binding of the created function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5930
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5931
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5932
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5933
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5934
     * @param {Function} func The function to restrict.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5935
     * @returns {Function} Returns the new restricted function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5936
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5937
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5938
     * var initialize = _.once(createApplication);
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();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5941
     * // `initialize` executes `createApplication` once
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5942
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5943
    function once(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5944
      var ran,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5945
          result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5946
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5947
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5948
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5949
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5950
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5951
        if (ran) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5952
          return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5953
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5954
        ran = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5955
        result = func.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5956
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5957
        // clear the `func` variable so the function may be garbage collected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5958
        func = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5959
        return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5964
     * Creates a function that, when called, invokes `func` with any additional
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5965
     * `partial` arguments prepended to those provided to the new function. This
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5966
     * 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
  5967
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5968
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5969
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5970
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5971
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5972
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5973
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5974
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5975
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5976
     * var greet = function(greeting, name) { return greeting + ' ' + name; };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5977
     * var hi = _.partial(greet, 'hi');
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
     * // => 'hi fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5980
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5981
    function partial(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5982
      return createWrapper(func, 16, slice(arguments, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5986
     * This method is like `_.partial` except that `partial` arguments are
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5987
     * appended to those provided to the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5988
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5989
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5990
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5991
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5992
     * @param {Function} func The function to partially apply arguments to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5993
     * @param {...*} [arg] Arguments to be partially applied.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5994
     * @returns {Function} Returns the new partially applied function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5995
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5996
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5997
     * var defaultsDeep = _.partialRight(_.merge, _.defaults);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5998
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5999
     * var options = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6000
     *   'variable': 'data',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6001
     *   'imports': { 'jq': $ }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6004
     * defaultsDeep(options, _.templateSettings);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6005
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6006
     * options.variable
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6007
     * // => 'data'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6008
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6009
     * options.imports
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6010
     * // => { '_': _, 'jq': $ }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6011
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6012
    function partialRight(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6013
      return createWrapper(func, 32, null, slice(arguments, 1));
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6017
     * 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
  6018
     * 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
  6019
     * 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
  6020
     * of the `wait` timeout. Subsequent calls to the throttled function will
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6021
     * return the result of the last `func` call.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6022
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6023
     * 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
  6024
     * 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
  6025
     * invoked more than once during the `wait` timeout.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6026
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6027
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6028
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6029
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6030
     * @param {Function} func The function to throttle.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6031
     * @param {number} wait The number of milliseconds to throttle executions to.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6032
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6033
     * @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
  6034
     * @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
  6035
     * @returns {Function} Returns the new throttled function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6036
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6037
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6038
     * // avoid excessively updating the position while scrolling
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6039
     * var throttled = _.throttle(updatePosition, 100);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6040
     * jQuery(window).on('scroll', throttled);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6041
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6042
     * // 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
  6043
     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6044
     *   'trailing': false
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
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6047
    function throttle(func, wait, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6048
      var leading = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6049
          trailing = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6050
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6051
      if (!isFunction(func)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6052
        throw new TypeError;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6053
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6054
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6055
        leading = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6056
      } else if (isObject(options)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6057
        leading = 'leading' in options ? options.leading : leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6058
        trailing = 'trailing' in options ? options.trailing : trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6059
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6060
      debounceOptions.leading = leading;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6061
      debounceOptions.maxWait = wait;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6062
      debounceOptions.trailing = trailing;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6063
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6064
      return debounce(func, wait, debounceOptions);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6068
     * 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
  6069
     * first argument. Additional arguments provided to the function are appended
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6070
     * 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
  6071
     * the `this` binding of the created function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6072
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6073
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6074
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6075
     * @category Functions
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6076
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6077
     * @param {Function} wrapper The wrapper function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6078
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6079
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6080
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6081
     * var p = _.wrap(_.escape, function(func, text) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6082
     *   return '<p>' + func(text) + '</p>';
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6085
     * p('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6086
     * // => '<p>Fred, Wilma, &amp; Pebbles</p>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6087
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6088
    function wrap(value, wrapper) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6089
      return createWrapper(wrapper, 16, [value]);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6095
     * Creates a function that returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6096
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6097
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6098
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6099
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6100
     * @param {*} value The value to return from the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6101
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6102
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6103
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6104
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6105
     * var getter = _.constant(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6106
     * getter() === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6107
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6108
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6109
    function constant(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6110
      return function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6111
        return value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6116
     * 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
  6117
     * 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
  6118
     * 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
  6119
     * that contain the equivalent object properties, otherwise it will return `false`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6120
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6121
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6122
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6123
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6124
     * @param {*} [func=identity] The value to convert to a callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6125
     * @param {*} [thisArg] The `this` binding of the created callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6126
     * @param {number} [argCount] The number of arguments the callback accepts.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6127
     * @returns {Function} Returns a callback function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6128
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6129
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6130
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6131
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6132
     *   { 'name': 'fred',   'age': 40 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6133
     * ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6134
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6135
     * // wrap to create custom callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6136
     * _.createCallback = _.wrap(_.createCallback, function(func, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6137
     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(callback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6138
     *   return !match ? func(callback, thisArg) : function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6139
     *     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
  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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6143
     * _.filter(characters, 'age__gt38');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6144
     * // => [{ 'name': 'fred', 'age': 40 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6145
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6146
    function createCallback(func, thisArg, argCount) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6147
      var type = typeof func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6148
      if (func == null || type == 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6149
        return baseCreateCallback(func, thisArg, argCount);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6150
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6151
      // handle "_.pluck" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6152
      if (type != 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6153
        return property(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6154
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6155
      var props = keys(func),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6156
          key = props[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6157
          a = func[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6158
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6159
      // handle "_.where" style callback shorthands
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6160
      if (props.length == 1 && a === a && !isObject(a)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6161
        // 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
  6162
        // property containing a primitive value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6163
        return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6164
          var b = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6165
          return a === b && (a !== 0 || (1 / a == 1 / b));
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6168
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6169
        var length = props.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6170
            result = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6171
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6172
        while (length--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6173
          if (!(result = baseIsEqual(object[props[length]], func[props[length]], null, true))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6174
            break;
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
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6177
        return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6182
     * Converts the characters `&`, `<`, `>`, `"`, and `'` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6183
     * corresponding HTML entities.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6184
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6185
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6186
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6187
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6188
     * @param {string} string The string to escape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6189
     * @returns {string} Returns the escaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6190
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6191
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6192
     * _.escape('Fred, Wilma, & Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6193
     * // => 'Fred, Wilma, &amp; Pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6194
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6195
    function escape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6196
      return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6200
     * This method returns the first argument provided to it.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6201
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6202
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6203
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6204
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6205
     * @param {*} value Any value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6206
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6207
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6208
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6209
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6210
     * _.identity(object) === object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6211
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6212
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6213
    function identity(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6214
      return value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6218
     * Adds function properties of a source object to the destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6219
     * 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
  6220
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6221
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6222
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6223
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6224
     * @param {Function|Object} [object=lodash] object The destination object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6225
     * @param {Object} source The object of functions to add.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6226
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6227
     * @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
  6228
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6229
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6230
     * function capitalize(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6231
     *   return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6234
     * _.mixin({ 'capitalize': capitalize });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6235
     * _.capitalize('fred');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6236
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6237
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6238
     * _('fred').capitalize().value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6239
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6240
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6241
     * _.mixin({ 'capitalize': capitalize }, { 'chain': false });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6242
     * _('fred').capitalize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6243
     * // => 'Fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6244
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6245
    function mixin(object, source, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6246
      var chain = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6247
          methodNames = source && functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6248
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6249
      if (!source || (!options && !methodNames.length)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6250
        if (options == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6251
          options = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6252
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6253
        ctor = lodashWrapper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6254
        source = object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6255
        object = lodash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6256
        methodNames = functions(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6257
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6258
      if (options === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6259
        chain = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6260
      } else if (isObject(options) && 'chain' in options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6261
        chain = options.chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6262
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6263
      var ctor = object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6264
          isFunc = isFunction(ctor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6265
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6266
      forEach(methodNames, function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6267
        var func = object[methodName] = source[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6268
        if (isFunc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6269
          ctor.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6270
            var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6271
                value = this.__wrapped__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6272
                args = [value];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6274
            push.apply(args, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6275
            var result = func.apply(object, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6276
            if (chain || chainAll) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6277
              if (value === result && isObject(result)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6278
                return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6279
              }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6280
              result = new ctor(result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6281
              result.__chain__ = chainAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6282
            }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6283
            return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6290
     * 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
  6291
     * the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6292
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6293
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6294
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6295
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6296
     * @returns {Function} Returns the `lodash` function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6297
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6298
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6299
     * var lodash = _.noConflict();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6300
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6301
    function noConflict() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6302
      context._ = oldDash;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6303
      return this;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6307
     * A no-operation function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6308
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6309
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6310
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6311
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6312
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6313
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6314
     * var object = { 'name': 'fred' };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6315
     * _.noop(object) === undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6316
     * // => true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6317
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6318
    function noop() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6319
      // no operation performed
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6323
     * 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
  6324
     * (1 January 1970 00:00:00 UTC).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6325
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6326
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6327
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6328
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6329
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6330
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6331
     * var stamp = _.now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6332
     * _.defer(function() { console.log(_.now() - stamp); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6333
     * // => 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
  6334
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6335
    var now = isNative(now = Date.now) && now || function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6336
      return new Date().getTime();
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6340
     * Converts the given value into an integer of the specified radix.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6341
     * 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
  6342
     * `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
  6343
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6344
     * Note: This method avoids differences in native ES3 and ES5 `parseInt`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6345
     * implementations. See http://es5.github.io/#E.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6346
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6347
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6348
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6349
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6350
     * @param {string} value The value to parse.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6351
     * @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
  6352
     * @returns {number} Returns the new integer value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6353
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6354
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6355
     * _.parseInt('08');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6356
     * // => 8
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6357
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6358
    var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6359
      // 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
  6360
      return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6364
     * 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
  6365
     * given object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6366
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6367
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6368
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6369
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6370
     * @param {string} key The name of the property to retrieve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6371
     * @returns {Function} Returns the new function.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6372
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6373
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6374
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6375
     *   { 'name': 'fred',   'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6376
     *   { 'name': 'barney', 'age': 36 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6379
     * var getName = _.property('name');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6380
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6381
     * _.map(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6382
     * // => ['barney', 'fred']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6383
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6384
     * _.sortBy(characters, getName);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6385
     * // => [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred',   'age': 40 }]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6386
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6387
    function property(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6388
      return function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6389
        return object[key];
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6394
     * 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
  6395
     * 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
  6396
     * 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
  6397
     * floating-point number will be returned instead of an integer.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6398
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6399
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6400
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6401
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6402
     * @param {number} [min=0] The minimum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6403
     * @param {number} [max=1] The maximum possible value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6404
     * @param {boolean} [floating=false] Specify returning a floating-point number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6405
     * @returns {number} Returns a random number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6406
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6407
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6408
     * _.random(0, 5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6409
     * // => an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6410
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6411
     * _.random(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6412
     * // => also an integer between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6413
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6414
     * _.random(5, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6415
     * // => a floating-point number between 0 and 5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6416
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6417
     * _.random(1.2, 5.2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6418
     * // => a floating-point number between 1.2 and 5.2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6419
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6420
    function random(min, max, floating) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6421
      var noMin = min == null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6422
          noMax = max == null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6423
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6424
      if (floating == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6425
        if (typeof min == 'boolean' && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6426
          floating = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6427
          min = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6428
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6429
        else if (!noMax && typeof max == 'boolean') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6430
          floating = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6431
          noMax = true;
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
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6434
      if (noMin && noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6435
        max = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6436
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6437
      min = +min || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6438
      if (noMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6439
        max = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6440
        min = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6441
      } else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6442
        max = +max || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6443
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6444
      if (floating || min % 1 || max % 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6445
        var rand = nativeRandom();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6446
        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
  6447
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6448
      return baseRandom(min, max);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6452
     * 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
  6453
     * 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
  6454
     * 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
  6455
     * is returned.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6456
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6457
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6458
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6459
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6460
     * @param {Object} object The object to inspect.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6461
     * @param {string} key The name of the property to resolve.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6462
     * @returns {*} Returns the resolved value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6463
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6464
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6465
     * var object = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6466
     *   'cheese': 'crumpets',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6467
     *   'stuff': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6468
     *     return 'nonsense';
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6472
     * _.result(object, 'cheese');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6473
     * // => 'crumpets'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6474
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6475
     * _.result(object, 'stuff');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6476
     * // => 'nonsense'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6477
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6478
    function result(object, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6479
      if (object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6480
        var value = object[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6481
        return isFunction(value) ? object[key]() : value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6486
     * A micro-templating method that handles arbitrary delimiters, preserves
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6487
     * whitespace, and correctly escapes quotes within interpolated code.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6488
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6489
     * Note: In the development build, `_.template` utilizes sourceURLs for easier
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6490
     * 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
  6491
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6492
     * For more information on precompiling templates see:
488
1324bd8747ff grunt copy-server the new changes of the client
rougeronj
parents: 461
diff changeset
  6493
     * https://lodash.com/custom-builds
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6494
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6495
     * For more information on Chrome extension sandboxes see:
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6496
     * http://developer.chrome.com/stable/extensions/sandboxingEval.html
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6497
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6498
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6499
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6500
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6501
     * @param {string} text The template text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6502
     * @param {Object} data The data object used to populate the text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6503
     * @param {Object} [options] The options object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6504
     * @param {RegExp} [options.escape] The "escape" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6505
     * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6506
     * @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
  6507
     * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6508
     * @param {string} [sourceURL] The sourceURL of the template's compiled source.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6509
     * @param {string} [variable] The data object variable name.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6510
     * @returns {Function|string} Returns a compiled function when no `data` object
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6511
     *  is given, else it returns the interpolated text.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6512
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6513
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6514
     * // using the "interpolate" delimiter to create a compiled template
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6515
     * var compiled = _.template('hello <%= name %>');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6516
     * compiled({ 'name': 'fred' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6517
     * // => 'hello fred'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6518
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6519
     * // using the "escape" delimiter to escape HTML in data property values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6520
     * _.template('<b><%- value %></b>', { 'value': '<script>' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6521
     * // => '<b>&lt;script&gt;</b>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6522
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6523
     * // using the "evaluate" delimiter to generate HTML
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6524
     * var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6525
     * _.template(list, { 'people': ['fred', 'barney'] });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6526
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6527
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6528
     * // 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
  6529
     * _.template('hello ${ name }', { 'name': 'pebbles' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6530
     * // => 'hello pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6531
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6532
     * // using the internal `print` function in "evaluate" delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6533
     * _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6534
     * // => 'hello barney!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6535
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6536
     * // using a custom template delimiters
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6537
     * _.templateSettings = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6538
     *   'interpolate': /{{([\s\S]+?)}}/g
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6541
     * _.template('hello {{ name }}!', { 'name': 'mustache' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6542
     * // => 'hello mustache!'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6543
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6544
     * // using the `imports` option to import jQuery
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6545
     * var list = '<% jq.each(people, function(name) { %><li><%- name %></li><% }); %>';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6546
     * _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { 'jq': jQuery } });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6547
     * // => '<li>fred</li><li>barney</li>'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6548
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6549
     * // 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
  6550
     * var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6551
     * compiled(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6552
     * // => 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
  6553
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6554
     * // 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
  6555
     * var compiled = _.template('hi <%= data.name %>!', null, { 'variable': 'data' });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6556
     * compiled.source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6557
     * // => function(data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6558
     *   var __t, __p = '', __e = _.escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6559
     *   __p += 'hi ' + ((__t = ( data.name )) == null ? '' : __t) + '!';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6560
     *   return __p;
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6563
     * // using the `source` property to inline compiled templates for meaningful
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6564
     * // line numbers in error messages and a stack trace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6565
     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6566
     *   var JST = {\
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6567
     *     "main": ' + _.template(mainText).source + '\
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
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6571
    function template(text, data, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6572
      // based on John Resig's `tmpl` implementation
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6573
      // http://ejohn.org/blog/javascript-micro-templating/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6574
      // and Laura Doktorova's doT.js
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6575
      // https://github.com/olado/doT
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6576
      var settings = lodash.templateSettings;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6577
      text = String(text || '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6578
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6579
      // avoid missing dependencies when `iteratorTemplate` is not defined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6580
      options = defaults({}, options, settings);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6581
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6582
      var imports = defaults({}, options.imports, settings.imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6583
          importsKeys = keys(imports),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6584
          importsValues = values(imports);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6585
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6586
      var isEvaluating,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6587
          index = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6588
          interpolate = options.interpolate || reNoMatch,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6589
          source = "__p += '";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6590
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6591
      // compile the regexp to match each delimiter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6592
      var reDelimiters = RegExp(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6593
        (options.escape || reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6594
        interpolate.source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6595
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6596
        (options.evaluate || reNoMatch).source + '|$'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6597
      , 'g');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6598
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6599
      text.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6600
        interpolateValue || (interpolateValue = esTemplateValue);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6601
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6602
        // escape characters that cannot be included in string literals
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6603
        source += text.slice(index, offset).replace(reUnescapedString, escapeStringChar);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6604
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6605
        // replace delimiters with snippets
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6606
        if (escapeValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6607
          source += "' +\n__e(" + escapeValue + ") +\n'";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6608
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6609
        if (evaluateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6610
          isEvaluating = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6611
          source += "';\n" + evaluateValue + ";\n__p += '";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6612
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6613
        if (interpolateValue) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6614
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6615
        }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6616
        index = offset + match.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6617
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6618
        // the JS engine embedded in Adobe products requires returning the `match`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6619
        // string in order to produce the correct `offset` value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6620
        return match;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6623
      source += "';\n";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6624
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6625
      // 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
  6626
      // 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
  6627
      var variable = options.variable,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6628
          hasVariable = variable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6629
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6630
      if (!hasVariable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6631
        variable = 'obj';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6632
        source = 'with (' + variable + ') {\n' + source + '\n}\n';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6633
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6634
      // cleanup code by stripping empty strings
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6635
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6636
        .replace(reEmptyStringMiddle, '$1')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6637
        .replace(reEmptyStringTrailing, '$1;');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6638
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6639
      // frame code as the function body
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6640
      source = 'function(' + variable + ') {\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6641
        (hasVariable ? '' : variable + ' || (' + variable + ' = {});\n') +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6642
        "var __t, __p = '', __e = _.escape" +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6643
        (isEvaluating
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6644
          ? ', __j = Array.prototype.join;\n' +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6645
            "function print() { __p += __j.call(arguments, '') }\n"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6646
          : ';\n'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6647
        ) +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6648
        source +
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6649
        'return __p\n}';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6650
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6651
      // Use a sourceURL for easier debugging.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6652
      // http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6653
      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
  6654
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6655
      try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6656
        var result = Function(importsKeys, 'return ' + source + sourceURL).apply(undefined, importsValues);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6657
      } catch(e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6658
        e.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6659
        throw e;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6660
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6661
      if (data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6662
        return result(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6663
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6664
      // provide the compiled function's source by its `toString` method, in
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6665
      // supported environments, or the `source` property as a convenience for
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6666
      // inlining compiled templates during the build process
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6667
      result.source = source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6668
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6672
     * Executes the callback `n` times, returning an array of the results
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6673
     * 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
  6674
     * with one argument; (index).
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6675
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6676
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6677
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6678
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6679
     * @param {number} n The number of times to execute the callback.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6680
     * @param {Function} callback The function called per iteration.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6681
     * @param {*} [thisArg] The `this` binding of `callback`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6682
     * @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
  6683
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6684
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6685
     * var diceRolls = _.times(3, _.partial(_.random, 1, 6));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6686
     * // => [3, 6, 4]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6687
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6688
     * _.times(3, function(n) { mage.castSpell(n); });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6689
     * // => 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
  6690
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6691
     * _.times(3, function(n) { this.cast(n); }, mage);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6692
     * // => also calls `mage.castSpell(n)` three times
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6693
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6694
    function times(n, callback, thisArg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6695
      n = (n = +n) > -1 ? n : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6696
      var index = -1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6697
          result = Array(n);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6698
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6699
      callback = baseCreateCallback(callback, thisArg, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6700
      while (++index < n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6701
        result[index] = callback(index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6702
      }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6703
      return result;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6707
     * The inverse of `_.escape` this method converts the HTML entities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6708
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to their
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6709
     * corresponding characters.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6710
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6711
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6712
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6713
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6714
     * @param {string} string The string to unescape.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6715
     * @returns {string} Returns the unescaped string.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6716
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6717
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6718
     * _.unescape('Fred, Barney &amp; Pebbles');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6719
     * // => 'Fred, Barney & Pebbles'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6720
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6721
    function unescape(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6722
      return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6726
     * 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
  6727
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6728
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6729
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6730
     * @category Utilities
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6731
     * @param {string} [prefix] The value to prefix the ID with.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6732
     * @returns {string} Returns the unique ID.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6733
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6734
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6735
     * _.uniqueId('contact_');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6736
     * // => 'contact_104'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6737
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6738
     * _.uniqueId();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6739
     * // => '105'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6740
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6741
    function uniqueId(prefix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6742
      var id = ++idCounter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6743
      return String(prefix == null ? '' : prefix) + id;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6749
     * Creates a `lodash` object that wraps the given value with explicit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6750
     * method chaining enabled.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6751
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6752
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6753
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6754
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6755
     * @param {*} value The value to wrap.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6756
     * @returns {Object} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6757
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6758
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6759
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6760
     *   { 'name': 'barney',  'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6761
     *   { 'name': 'fred',    'age': 40 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6762
     *   { 'name': 'pebbles', 'age': 1 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6765
     * var youngest = _.chain(characters)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6766
     *     .sortBy('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6767
     *     .map(function(chr) { return chr.name + ' is ' + chr.age; })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6768
     *     .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6769
     *     .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6770
     * // => 'pebbles is 1'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6771
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6772
    function chain(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6773
      value = new lodashWrapper(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6774
      value.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6775
      return value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6779
     * Invokes `interceptor` with the `value` as the first argument and then
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6780
     * 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
  6781
     * chain in order to perform operations on intermediate results within
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6782
     * the chain.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6783
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6784
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6785
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6786
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6787
     * @param {*} value The value to provide to `interceptor`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6788
     * @param {Function} interceptor The function to invoke.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6789
     * @returns {*} Returns `value`.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6790
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6791
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6792
     * _([1, 2, 3, 4])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6793
     *  .tap(function(array) { array.pop(); })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6794
     *  .reverse()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6795
     *  .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6796
     * // => [3, 2, 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6797
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6798
    function tap(value, interceptor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6799
      interceptor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6800
      return value;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6804
     * Enables explicit method chaining on the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6805
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6806
     * @name chain
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6807
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6808
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6809
     * @returns {*} Returns the wrapper object.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6810
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6811
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6812
     * var characters = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6813
     *   { 'name': 'barney', 'age': 36 },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6814
     *   { 'name': 'fred',   'age': 40 }
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
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6817
     * // without explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6818
     * _(characters).first();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6819
     * // => { 'name': 'barney', 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6820
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6821
     * // with explicit chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6822
     * _(characters).chain()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6823
     *   .first()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6824
     *   .pick('age')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6825
     *   .value();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6826
     * // => { 'age': 36 }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6827
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6828
    function wrapperChain() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6829
      this.__chain__ = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6830
      return this;
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6834
     * Produces the `toString` result of the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6835
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6836
     * @name toString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6837
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6838
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6839
     * @returns {string} Returns the string result.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6840
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6841
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6842
     * _([1, 2, 3]).toString();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6843
     * // => '1,2,3'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6844
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6845
    function wrapperToString() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6846
      return String(this.__wrapped__);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6850
     * Extracts the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6851
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6852
     * @name valueOf
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6853
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6854
     * @alias value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6855
     * @category Chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6856
     * @returns {*} Returns the wrapped value.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6857
     * @example
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6858
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6859
     * _([1, 2, 3]).valueOf();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6860
     * // => [1, 2, 3]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6861
     */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6862
    function wrapperValueOf() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6863
      return this.__wrapped__;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6868
    // add functions that return wrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6869
    lodash.after = after;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6870
    lodash.assign = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6871
    lodash.at = at;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6872
    lodash.bind = bind;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6873
    lodash.bindAll = bindAll;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6874
    lodash.bindKey = bindKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6875
    lodash.chain = chain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6876
    lodash.compact = compact;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6877
    lodash.compose = compose;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6878
    lodash.constant = constant;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6879
    lodash.countBy = countBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6880
    lodash.create = create;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6881
    lodash.createCallback = createCallback;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6882
    lodash.curry = curry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6883
    lodash.debounce = debounce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6884
    lodash.defaults = defaults;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6885
    lodash.defer = defer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6886
    lodash.delay = delay;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6887
    lodash.difference = difference;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6888
    lodash.filter = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6889
    lodash.flatten = flatten;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6890
    lodash.forEach = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6891
    lodash.forEachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6892
    lodash.forIn = forIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6893
    lodash.forInRight = forInRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6894
    lodash.forOwn = forOwn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6895
    lodash.forOwnRight = forOwnRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6896
    lodash.functions = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6897
    lodash.groupBy = groupBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6898
    lodash.indexBy = indexBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6899
    lodash.initial = initial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6900
    lodash.intersection = intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6901
    lodash.invert = invert;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6902
    lodash.invoke = invoke;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6903
    lodash.keys = keys;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6904
    lodash.map = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6905
    lodash.mapValues = mapValues;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6906
    lodash.max = max;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6907
    lodash.memoize = memoize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6908
    lodash.merge = merge;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6909
    lodash.min = min;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6910
    lodash.omit = omit;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6911
    lodash.once = once;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6912
    lodash.pairs = pairs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6913
    lodash.partial = partial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6914
    lodash.partialRight = partialRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6915
    lodash.pick = pick;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6916
    lodash.pluck = pluck;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6917
    lodash.property = property;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6918
    lodash.pull = pull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6919
    lodash.range = range;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6920
    lodash.reject = reject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6921
    lodash.remove = remove;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6922
    lodash.rest = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6923
    lodash.shuffle = shuffle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6924
    lodash.sortBy = sortBy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6925
    lodash.tap = tap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6926
    lodash.throttle = throttle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6927
    lodash.times = times;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6928
    lodash.toArray = toArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6929
    lodash.transform = transform;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6930
    lodash.union = union;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6931
    lodash.uniq = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6932
    lodash.values = values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6933
    lodash.where = where;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6934
    lodash.without = without;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6935
    lodash.wrap = wrap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6936
    lodash.xor = xor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6937
    lodash.zip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6938
    lodash.zipObject = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6939
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6940
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6941
    lodash.collect = map;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6942
    lodash.drop = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6943
    lodash.each = forEach;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6944
    lodash.eachRight = forEachRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6945
    lodash.extend = assign;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6946
    lodash.methods = functions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6947
    lodash.object = zipObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6948
    lodash.select = filter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6949
    lodash.tail = rest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6950
    lodash.unique = uniq;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6951
    lodash.unzip = zip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6952
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6953
    // add functions to `lodash.prototype`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6954
    mixin(lodash);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6958
    // add functions that return unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6959
    lodash.clone = clone;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6960
    lodash.cloneDeep = cloneDeep;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6961
    lodash.contains = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6962
    lodash.escape = escape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6963
    lodash.every = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6964
    lodash.find = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6965
    lodash.findIndex = findIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6966
    lodash.findKey = findKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6967
    lodash.findLast = findLast;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6968
    lodash.findLastIndex = findLastIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6969
    lodash.findLastKey = findLastKey;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6970
    lodash.has = has;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6971
    lodash.identity = identity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6972
    lodash.indexOf = indexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6973
    lodash.isArguments = isArguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6974
    lodash.isArray = isArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6975
    lodash.isBoolean = isBoolean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6976
    lodash.isDate = isDate;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6977
    lodash.isElement = isElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6978
    lodash.isEmpty = isEmpty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6979
    lodash.isEqual = isEqual;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6980
    lodash.isFinite = isFinite;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6981
    lodash.isFunction = isFunction;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6982
    lodash.isNaN = isNaN;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6983
    lodash.isNull = isNull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6984
    lodash.isNumber = isNumber;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6985
    lodash.isObject = isObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6986
    lodash.isPlainObject = isPlainObject;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6987
    lodash.isRegExp = isRegExp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6988
    lodash.isString = isString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6989
    lodash.isUndefined = isUndefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6990
    lodash.lastIndexOf = lastIndexOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6991
    lodash.mixin = mixin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6992
    lodash.noConflict = noConflict;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6993
    lodash.noop = noop;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6994
    lodash.now = now;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6995
    lodash.parseInt = parseInt;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6996
    lodash.random = random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6997
    lodash.reduce = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6998
    lodash.reduceRight = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6999
    lodash.result = result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7000
    lodash.runInContext = runInContext;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7001
    lodash.size = size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7002
    lodash.some = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7003
    lodash.sortedIndex = sortedIndex;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7004
    lodash.template = template;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7005
    lodash.unescape = unescape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7006
    lodash.uniqueId = uniqueId;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7007
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7008
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7009
    lodash.all = every;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7010
    lodash.any = some;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7011
    lodash.detect = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7012
    lodash.findWhere = find;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7013
    lodash.foldl = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7014
    lodash.foldr = reduceRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7015
    lodash.include = contains;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7016
    lodash.inject = reduce;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7017
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7018
    mixin(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7019
      var source = {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7020
      forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7021
        if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7022
          source[methodName] = func;
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
      });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7025
      return source;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7026
    }(), false);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7030
    // add functions capable of returning wrapped and unwrapped values when chaining
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7031
    lodash.first = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7032
    lodash.last = last;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7033
    lodash.sample = sample;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7035
    // add aliases
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7036
    lodash.take = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7037
    lodash.head = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7038
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7039
    forOwn(lodash, function(func, methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7040
      var callbackable = methodName !== 'sample';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7041
      if (!lodash.prototype[methodName]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7042
        lodash.prototype[methodName]= function(n, guard) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7043
          var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7044
              result = func(this.__wrapped__, n, guard);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7045
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7046
          return !chainAll && (n == null || (guard && !(callbackable && typeof n == 'function')))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7047
            ? result
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7048
            : new lodashWrapper(result, chainAll);
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
    /**
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7056
     * The semantic version number.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7057
     *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7058
     * @static
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7059
     * @memberOf _
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7060
     * @type string
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7061
     */
488
1324bd8747ff grunt copy-server the new changes of the client
rougeronj
parents: 461
diff changeset
  7062
    lodash.VERSION = '2.4.2';
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7063
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7064
    // add "Chaining" functions to the wrapper
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7065
    lodash.prototype.chain = wrapperChain;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7066
    lodash.prototype.toString = wrapperToString;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7067
    lodash.prototype.value = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7068
    lodash.prototype.valueOf = wrapperValueOf;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7069
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7070
    // add `Array` functions that return unwrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7071
    baseEach(['join', 'pop', 'shift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7072
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7073
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7074
        var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7075
            result = func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7077
        return chainAll
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7078
          ? new lodashWrapper(result, chainAll)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7079
          : result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7083
    // add `Array` functions that return the existing wrapped value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7084
    baseEach(['push', 'reverse', 'sort', 'unshift'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7085
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7086
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7087
        func.apply(this.__wrapped__, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7088
        return this;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7092
    // add `Array` functions that return new wrapped values
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7093
    baseEach(['concat', 'slice', 'splice'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7094
      var func = arrayRef[methodName];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7095
      lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7096
        return new lodashWrapper(func.apply(this.__wrapped__, arguments), this.__chain__);
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7100
    // avoid array-like object bugs with `Array#shift` and `Array#splice`
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7101
    // in IE < 9, Firefox < 10, Narwhal, and RingoJS
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7102
    if (!support.spliceObjects) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7103
      baseEach(['pop', 'shift', 'splice'], function(methodName) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7104
        var func = arrayRef[methodName],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7105
            isSplice = methodName == 'splice';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7106
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7107
        lodash.prototype[methodName] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7108
          var chainAll = this.__chain__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7109
              value = this.__wrapped__,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7110
              result = func.apply(value, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7111
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7112
          if (value.length === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7113
            delete value[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7114
          }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7115
          return (chainAll || isSplice)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7116
            ? new lodashWrapper(result, chainAll)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7117
            : result;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7122
    return lodash;
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
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7127
  // expose Lo-Dash
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7128
  var _ = runInContext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7129
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7130
  // 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
  7131
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7132
    // 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
  7133
    // case Lo-Dash is loaded with a RequireJS shim config.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7134
    // See http://requirejs.org/docs/api.html#config-shim
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7135
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7136
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7137
    // 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
  7138
    // referenced as the "underscore" module
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7139
    define(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7140
      return _;
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
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7143
  // 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
  7144
  else if (freeExports && freeModule) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7145
    // in Node.js or RingoJS
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7146
    if (moduleExports) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7147
      (freeModule.exports = _)._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7148
    }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7149
    // in Narwhal or Rhino -require
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7150
    else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7151
      freeExports._ = _;
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
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7154
  else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7155
    // in a browser or Rhino
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7156
    root._ = _;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7157
  }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7158
}.call(this));