mirror of
https://github.com/ONLYOFFICE/web-apps.git
synced 2026-04-07 14:06:16 +08:00
4725 lines
244 KiB
HTML
4725 lines
244 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html>
|
||
<head>
|
||
<title>underscore-esm.js</title>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
||
<link rel="stylesheet" media="all" href="docco.css" />
|
||
</head>
|
||
<body>
|
||
<div id="container">
|
||
<div id="background"></div>
|
||
|
||
<ul class="sections">
|
||
|
||
<li id="title">
|
||
<div class="annotation">
|
||
<h1>underscore-esm.js</h1>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li id="section-1">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-1">¶</a>
|
||
</div>
|
||
<pre><code><span class="hljs-title class_">Underscore</span>.<span class="hljs-property">js</span> <span class="hljs-number">1.13</span><span class="hljs-number">.6</span>
|
||
<span class="hljs-attr">https</span>:<span class="hljs-comment">//underscorejs.org</span>
|
||
(c) <span class="hljs-number">2009</span>-<span class="hljs-number">2022</span> <span class="hljs-title class_">Jeremy</span> <span class="hljs-title class_">Ashkenas</span>, <span class="hljs-title class_">Julian</span> <span class="hljs-title class_">Gonggrijp</span>, and <span class="hljs-title class_">DocumentCloud</span> and <span class="hljs-title class_">Investigative</span> <span class="hljs-title class_">Reporters</span> & <span class="hljs-title class_">Editors</span>
|
||
<span class="hljs-title class_">Underscore</span> may be freely distributed under the <span class="hljs-variable constant_">MIT</span> license.
|
||
</code></pre>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-2">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-2">¶</a>
|
||
</div>
|
||
<p>Current version.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> <span class="hljs-variable constant_">VERSION</span> = <span class="hljs-string">'1.13.6'</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-3">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-3">¶</a>
|
||
</div>
|
||
<p>Establish the root object, <code>window</code> (<code>self</code>) in the browser, <code>global</code>
|
||
on the server, or <code>this</code> in some virtual machines. We use <code>self</code>
|
||
instead of <code>window</code> for <code>WebWorker</code> support.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> root = (<span class="hljs-keyword">typeof</span> self == <span class="hljs-string">'object'</span> && self.<span class="hljs-property">self</span> === self && self) ||
|
||
(<span class="hljs-keyword">typeof</span> <span class="hljs-variable language_">global</span> == <span class="hljs-string">'object'</span> && <span class="hljs-variable language_">global</span>.<span class="hljs-property">global</span> === <span class="hljs-variable language_">global</span> && <span class="hljs-variable language_">global</span>) ||
|
||
<span class="hljs-title class_">Function</span>(<span class="hljs-string">'return this'</span>)() ||
|
||
{};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-4">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-4">¶</a>
|
||
</div>
|
||
<p>Save bytes in the minified (but not gzipped) version:</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> <span class="hljs-title class_">ArrayProto</span> = <span class="hljs-title class_">Array</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>, <span class="hljs-title class_">ObjProto</span> = <span class="hljs-title class_">Object</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>;
|
||
<span class="hljs-keyword">var</span> <span class="hljs-title class_">SymbolProto</span> = <span class="hljs-keyword">typeof</span> <span class="hljs-title class_">Symbol</span> !== <span class="hljs-string">'undefined'</span> ? <span class="hljs-title class_">Symbol</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span> : <span class="hljs-literal">null</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-5">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-5">¶</a>
|
||
</div>
|
||
<p>Create quick reference variables for speed access to core prototypes.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> push = <span class="hljs-title class_">ArrayProto</span>.<span class="hljs-property">push</span>,
|
||
slice = <span class="hljs-title class_">ArrayProto</span>.<span class="hljs-property">slice</span>,
|
||
toString = <span class="hljs-title class_">ObjProto</span>.<span class="hljs-property">toString</span>,
|
||
hasOwnProperty = <span class="hljs-title class_">ObjProto</span>.<span class="hljs-property">hasOwnProperty</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-6">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-6">¶</a>
|
||
</div>
|
||
<p>Modern feature detection.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> supportsArrayBuffer = <span class="hljs-keyword">typeof</span> <span class="hljs-title class_">ArrayBuffer</span> !== <span class="hljs-string">'undefined'</span>,
|
||
supportsDataView = <span class="hljs-keyword">typeof</span> <span class="hljs-title class_">DataView</span> !== <span class="hljs-string">'undefined'</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-7">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-7">¶</a>
|
||
</div>
|
||
<p>All <strong>ECMAScript 5+</strong> native function implementations that we hope to use
|
||
are declared here.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> nativeIsArray = <span class="hljs-title class_">Array</span>.<span class="hljs-property">isArray</span>,
|
||
nativeKeys = <span class="hljs-title class_">Object</span>.<span class="hljs-property">keys</span>,
|
||
nativeCreate = <span class="hljs-title class_">Object</span>.<span class="hljs-property">create</span>,
|
||
nativeIsView = supportsArrayBuffer && <span class="hljs-title class_">ArrayBuffer</span>.<span class="hljs-property">isView</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-8">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-8">¶</a>
|
||
</div>
|
||
<p>Create references to these builtin functions because we override them.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> _isNaN = <span class="hljs-built_in">isNaN</span>,
|
||
_isFinite = <span class="hljs-built_in">isFinite</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-9">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-9">¶</a>
|
||
</div>
|
||
<p>Keys in IE < 9 that won’t be iterated by <code>for key in ...</code> and thus missed.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> hasEnumBug = !{<span class="hljs-attr">toString</span>: <span class="hljs-literal">null</span>}.<span class="hljs-title function_">propertyIsEnumerable</span>(<span class="hljs-string">'toString'</span>);
|
||
<span class="hljs-keyword">var</span> nonEnumerableProps = [<span class="hljs-string">'valueOf'</span>, <span class="hljs-string">'isPrototypeOf'</span>, <span class="hljs-string">'toString'</span>,
|
||
<span class="hljs-string">'propertyIsEnumerable'</span>, <span class="hljs-string">'hasOwnProperty'</span>, <span class="hljs-string">'toLocaleString'</span>];</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-10">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-10">¶</a>
|
||
</div>
|
||
<p>The largest integer that can be represented exactly.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> <span class="hljs-variable constant_">MAX_ARRAY_INDEX</span> = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">pow</span>(<span class="hljs-number">2</span>, <span class="hljs-number">53</span>) - <span class="hljs-number">1</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-11">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-11">¶</a>
|
||
</div>
|
||
<p>Some functions take a variable number of arguments, or a few expected
|
||
arguments at the beginning and then a variable number of values to operate
|
||
on. This helper accumulates all remaining arguments past the function’s
|
||
argument length (or an explicit <code>startIndex</code>), into an array that becomes
|
||
the last argument. Similar to ES6’s “rest parameter”.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">restArguments</span>(<span class="hljs-params">func, startIndex</span>) {
|
||
startIndex = startIndex == <span class="hljs-literal">null</span> ? func.<span class="hljs-property">length</span> - <span class="hljs-number">1</span> : +startIndex;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span> - startIndex, <span class="hljs-number">0</span>),
|
||
rest = <span class="hljs-title class_">Array</span>(length),
|
||
index = <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">for</span> (; index < length; index++) {
|
||
rest[index] = <span class="hljs-variable language_">arguments</span>[index + startIndex];
|
||
}
|
||
<span class="hljs-keyword">switch</span> (startIndex) {
|
||
<span class="hljs-keyword">case</span> <span class="hljs-number">0</span>: <span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, rest);
|
||
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>[<span class="hljs-number">0</span>], rest);
|
||
<span class="hljs-keyword">case</span> <span class="hljs-number">2</span>: <span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>[<span class="hljs-number">0</span>], <span class="hljs-variable language_">arguments</span>[<span class="hljs-number">1</span>], rest);
|
||
}
|
||
<span class="hljs-keyword">var</span> args = <span class="hljs-title class_">Array</span>(startIndex + <span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">for</span> (index = <span class="hljs-number">0</span>; index < startIndex; index++) {
|
||
args[index] = <span class="hljs-variable language_">arguments</span>[index];
|
||
}
|
||
args[startIndex] = rest;
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, args);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-12">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-12">¶</a>
|
||
</div>
|
||
<p>Is a given variable an object?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isObject</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> type = <span class="hljs-keyword">typeof</span> obj;
|
||
<span class="hljs-keyword">return</span> type === <span class="hljs-string">'function'</span> || (type === <span class="hljs-string">'object'</span> && !!obj);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-13">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-13">¶</a>
|
||
</div>
|
||
<p>Is a given value equal to null?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isNull</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> obj === <span class="hljs-literal">null</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-14">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-14">¶</a>
|
||
</div>
|
||
<p>Is a given variable undefined?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isUndefined</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> obj === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-15">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-15">¶</a>
|
||
</div>
|
||
<p>Is a given value a boolean?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isBoolean</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> obj === <span class="hljs-literal">true</span> || obj === <span class="hljs-literal">false</span> || toString.<span class="hljs-title function_">call</span>(obj) === <span class="hljs-string">'[object Boolean]'</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-16">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-16">¶</a>
|
||
</div>
|
||
<p>Is a given value a DOM element?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isElement</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> !!(obj && obj.<span class="hljs-property">nodeType</span> === <span class="hljs-number">1</span>);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-17">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-17">¶</a>
|
||
</div>
|
||
<p>Internal function for creating a <code>toString</code>-based type tester.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">tagTester</span>(<span class="hljs-params">name</span>) {
|
||
<span class="hljs-keyword">var</span> tag = <span class="hljs-string">'[object '</span> + name + <span class="hljs-string">']'</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> toString.<span class="hljs-title function_">call</span>(obj) === tag;
|
||
};
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> isString = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'String'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isNumber = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Number'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isDate = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Date'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isRegExp = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'RegExp'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isError = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Error'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isSymbol = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Symbol'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isArrayBuffer = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'ArrayBuffer'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isFunction = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Function'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-18">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-18">¶</a>
|
||
</div>
|
||
<p>Optimize <code>isFunction</code> if appropriate. Work around some <code>typeof</code> bugs in old
|
||
v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> nodelist = root.<span class="hljs-property">document</span> && root.<span class="hljs-property">document</span>.<span class="hljs-property">childNodes</span>;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> /./ != <span class="hljs-string">'function'</span> && <span class="hljs-keyword">typeof</span> <span class="hljs-title class_">Int8Array</span> != <span class="hljs-string">'object'</span> && <span class="hljs-keyword">typeof</span> nodelist != <span class="hljs-string">'function'</span>) {
|
||
isFunction = <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">typeof</span> obj == <span class="hljs-string">'function'</span> || <span class="hljs-literal">false</span>;
|
||
};
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> isFunction$<span class="hljs-number">1</span> = isFunction;
|
||
|
||
<span class="hljs-keyword">var</span> hasObjectTag = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Object'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-19">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-19">¶</a>
|
||
</div>
|
||
<p>In IE 10 - Edge 13, <code>DataView</code> has string tag <code>'[object Object]'</code>.
|
||
In IE 11, the most common among them, this problem also applies to
|
||
<code>Map</code>, <code>WeakMap</code> and <code>Set</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> hasStringTagBug = (
|
||
supportsDataView && <span class="hljs-title function_">hasObjectTag</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">DataView</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayBuffer</span>(<span class="hljs-number">8</span>)))
|
||
),
|
||
isIE11 = (<span class="hljs-keyword">typeof</span> <span class="hljs-title class_">Map</span> !== <span class="hljs-string">'undefined'</span> && <span class="hljs-title function_">hasObjectTag</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Map</span>));
|
||
|
||
<span class="hljs-keyword">var</span> isDataView = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'DataView'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-20">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-20">¶</a>
|
||
</div>
|
||
<p>In IE 10 - Edge 13, we need a different heuristic
|
||
to determine whether an object is a <code>DataView</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">ie10IsDataView</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> obj != <span class="hljs-literal">null</span> && <span class="hljs-title function_">isFunction$1</span>(obj.<span class="hljs-property">getInt8</span>) && <span class="hljs-title function_">isArrayBuffer</span>(obj.<span class="hljs-property">buffer</span>);
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> isDataView$<span class="hljs-number">1</span> = (hasStringTagBug ? ie10IsDataView : isDataView);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-21">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-21">¶</a>
|
||
</div>
|
||
<p>Is a given value an array?
|
||
Delegates to ECMA5’s native <code>Array.isArray</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> isArray = nativeIsArray || <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Array'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-22">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-22">¶</a>
|
||
</div>
|
||
<p>Internal function to check whether <code>key</code> is an own property name of <code>obj</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">has$1</span>(<span class="hljs-params">obj, key</span>) {
|
||
<span class="hljs-keyword">return</span> obj != <span class="hljs-literal">null</span> && hasOwnProperty.<span class="hljs-title function_">call</span>(obj, key);
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> isArguments = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Arguments'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-23">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-23">¶</a>
|
||
</div>
|
||
<p>Define a fallback version of the method in browsers (ahem, IE < 9), where
|
||
there isn’t any inspectable “Arguments” type.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>(<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isArguments</span>(<span class="hljs-variable language_">arguments</span>)) {
|
||
isArguments = <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">has$1</span>(obj, <span class="hljs-string">'callee'</span>);
|
||
};
|
||
}
|
||
}());
|
||
|
||
<span class="hljs-keyword">var</span> isArguments$<span class="hljs-number">1</span> = isArguments;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-24">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-24">¶</a>
|
||
</div>
|
||
<p>Is a given object a finite number?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isFinite$1</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> !<span class="hljs-title function_">isSymbol</span>(obj) && <span class="hljs-title function_">_isFinite</span>(obj) && !<span class="hljs-built_in">isNaN</span>(<span class="hljs-built_in">parseFloat</span>(obj));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-25">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-25">¶</a>
|
||
</div>
|
||
<p>Is the given value <code>NaN</code>?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isNaN$1</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isNumber</span>(obj) && <span class="hljs-title function_">_isNaN</span>(obj);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-26">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-26">¶</a>
|
||
</div>
|
||
<p>Predicate-generating function. Often useful outside of Underscore.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">constant</span>(<span class="hljs-params">value</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> value;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-27">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-27">¶</a>
|
||
</div>
|
||
<p>Common internal logic for <code>isArrayLike</code> and <code>isBufferLike</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createSizePropertyCheck</span>(<span class="hljs-params">getSizeProperty</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">collection</span>) {
|
||
<span class="hljs-keyword">var</span> sizeProperty = <span class="hljs-title function_">getSizeProperty</span>(collection);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">typeof</span> sizeProperty == <span class="hljs-string">'number'</span> && sizeProperty >= <span class="hljs-number">0</span> && sizeProperty <= <span class="hljs-variable constant_">MAX_ARRAY_INDEX</span>;
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-28">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-28">¶</a>
|
||
</div>
|
||
<p>Internal helper to generate a function to obtain property <code>key</code> from <code>obj</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">shallowProperty</span>(<span class="hljs-params">key</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> obj == <span class="hljs-literal">null</span> ? <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> : obj[key];
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-29">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-29">¶</a>
|
||
</div>
|
||
<p>Internal helper to obtain the <code>byteLength</code> property of an object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> getByteLength = <span class="hljs-title function_">shallowProperty</span>(<span class="hljs-string">'byteLength'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-30">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-30">¶</a>
|
||
</div>
|
||
<p>Internal helper to determine whether we should spend extensive checks against
|
||
<code>ArrayBuffer</code> et al.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> isBufferLike = <span class="hljs-title function_">createSizePropertyCheck</span>(getByteLength);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-31">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-31">¶</a>
|
||
</div>
|
||
<p>Is a given value a typed array?</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> typedArrayPattern = <span class="hljs-regexp">/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/</span>;
|
||
<span class="hljs-keyword">function</span> <span class="hljs-title function_">isTypedArray</span>(<span class="hljs-params">obj</span>) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-32">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-32">¶</a>
|
||
</div>
|
||
<p><code>ArrayBuffer.isView</code> is the most future-proof, so use it when available.
|
||
Otherwise, fall back on the above regular expression.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> nativeIsView ? (<span class="hljs-title function_">nativeIsView</span>(obj) && !<span class="hljs-title function_">isDataView$1</span>(obj)) :
|
||
<span class="hljs-title function_">isBufferLike</span>(obj) && typedArrayPattern.<span class="hljs-title function_">test</span>(toString.<span class="hljs-title function_">call</span>(obj));
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> isTypedArray$<span class="hljs-number">1</span> = supportsArrayBuffer ? isTypedArray : <span class="hljs-title function_">constant</span>(<span class="hljs-literal">false</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-33">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-33">¶</a>
|
||
</div>
|
||
<p>Internal helper to obtain the <code>length</code> property of an object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> getLength = <span class="hljs-title function_">shallowProperty</span>(<span class="hljs-string">'length'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-34">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-34">¶</a>
|
||
</div>
|
||
<p>Internal helper to create a simple lookup structure.
|
||
<code>collectNonEnumProps</code> used to depend on <code>_.contains</code>, but this led to
|
||
circular imports. <code>emulatedSet</code> is a one-off solution that only works for
|
||
arrays of strings.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">emulatedSet</span>(<span class="hljs-params">keys</span>) {
|
||
<span class="hljs-keyword">var</span> hash = {};
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> l = keys.<span class="hljs-property">length</span>, i = <span class="hljs-number">0</span>; i < l; ++i) hash[keys[i]] = <span class="hljs-literal">true</span>;
|
||
<span class="hljs-keyword">return</span> {
|
||
<span class="hljs-attr">contains</span>: <span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) { <span class="hljs-keyword">return</span> hash[key] === <span class="hljs-literal">true</span>; },
|
||
<span class="hljs-attr">push</span>: <span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) {
|
||
hash[key] = <span class="hljs-literal">true</span>;
|
||
<span class="hljs-keyword">return</span> keys.<span class="hljs-title function_">push</span>(key);
|
||
}
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-35">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-35">¶</a>
|
||
</div>
|
||
<p>Internal helper. Checks <code>keys</code> for the presence of keys in IE < 9 that won’t
|
||
be iterated by <code>for key in ...</code> and thus missed. Extends <code>keys</code> in place if
|
||
needed.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">collectNonEnumProps</span>(<span class="hljs-params">obj, keys</span>) {
|
||
keys = <span class="hljs-title function_">emulatedSet</span>(keys);
|
||
<span class="hljs-keyword">var</span> nonEnumIdx = nonEnumerableProps.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">var</span> constructor = obj.<span class="hljs-property">constructor</span>;
|
||
<span class="hljs-keyword">var</span> proto = (<span class="hljs-title function_">isFunction$1</span>(constructor) && constructor.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>) || <span class="hljs-title class_">ObjProto</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-36">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-36">¶</a>
|
||
</div>
|
||
<p>Constructor is a special case.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> prop = <span class="hljs-string">'constructor'</span>;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">has$1</span>(obj, prop) && !keys.<span class="hljs-title function_">contains</span>(prop)) keys.<span class="hljs-title function_">push</span>(prop);
|
||
|
||
<span class="hljs-keyword">while</span> (nonEnumIdx--) {
|
||
prop = nonEnumerableProps[nonEnumIdx];
|
||
<span class="hljs-keyword">if</span> (prop <span class="hljs-keyword">in</span> obj && obj[prop] !== proto[prop] && !keys.<span class="hljs-title function_">contains</span>(prop)) {
|
||
keys.<span class="hljs-title function_">push</span>(prop);
|
||
}
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-37">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-37">¶</a>
|
||
</div>
|
||
<p>Retrieve the names of an object’s own properties.
|
||
Delegates to <strong>ECMAScript 5</strong>‘s native <code>Object.keys</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">keys</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isObject</span>(obj)) <span class="hljs-keyword">return</span> [];
|
||
<span class="hljs-keyword">if</span> (nativeKeys) <span class="hljs-keyword">return</span> <span class="hljs-title function_">nativeKeys</span>(obj);
|
||
<span class="hljs-keyword">var</span> keys = [];
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> key <span class="hljs-keyword">in</span> obj) <span class="hljs-keyword">if</span> (<span class="hljs-title function_">has$1</span>(obj, key)) keys.<span class="hljs-title function_">push</span>(key);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-38">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-38">¶</a>
|
||
</div>
|
||
<p>Ahem, IE < 9.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (hasEnumBug) <span class="hljs-title function_">collectNonEnumProps</span>(obj, keys);
|
||
<span class="hljs-keyword">return</span> keys;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-39">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-39">¶</a>
|
||
</div>
|
||
<p>Is a given array, string, or object empty?
|
||
An “empty” object has no enumerable own-properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isEmpty</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-40">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-40">¶</a>
|
||
</div>
|
||
<p>Skip the more expensive <code>toString</code>-based type checks if <code>obj</code> has no
|
||
<code>.length</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> length = <span class="hljs-title function_">getLength</span>(obj);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> length == <span class="hljs-string">'number'</span> && (
|
||
<span class="hljs-title function_">isArray</span>(obj) || <span class="hljs-title function_">isString</span>(obj) || <span class="hljs-title function_">isArguments$1</span>(obj)
|
||
)) <span class="hljs-keyword">return</span> length === <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">getLength</span>(<span class="hljs-title function_">keys</span>(obj)) === <span class="hljs-number">0</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-41">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-41">¶</a>
|
||
</div>
|
||
<p>Returns whether an object has a given set of <code>key:value</code> pairs.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isMatch</span>(<span class="hljs-params">object, attrs</span>) {
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(attrs), length = _keys.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">if</span> (object == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> !length;
|
||
<span class="hljs-keyword">var</span> obj = <span class="hljs-title class_">Object</span>(object);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
<span class="hljs-keyword">var</span> key = _keys[i];
|
||
<span class="hljs-keyword">if</span> (attrs[key] !== obj[key] || !(key <span class="hljs-keyword">in</span> obj)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-42">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-42">¶</a>
|
||
</div>
|
||
<p>If Underscore is called as a function, it returns a wrapped object that can
|
||
be used OO-style. This wrapper holds altered versions of all functions added
|
||
through <code>_.mixin</code>. Wrapped objects may be chained.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">_$1</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (obj <span class="hljs-keyword">instanceof</span> _$<span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> obj;
|
||
<span class="hljs-keyword">if</span> (!(<span class="hljs-variable language_">this</span> <span class="hljs-keyword">instanceof</span> _$<span class="hljs-number">1</span>)) <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title function_">_$1</span>(obj);
|
||
<span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span> = obj;
|
||
}
|
||
|
||
_$<span class="hljs-number">1.</span><span class="hljs-variable constant_">VERSION</span> = <span class="hljs-variable constant_">VERSION</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-43">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-43">¶</a>
|
||
</div>
|
||
<p>Extracts the result from a wrapped and chained object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>_$<span class="hljs-number">1.</span>prototype.<span class="hljs-property">value</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span>;
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-44">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-44">¶</a>
|
||
</div>
|
||
<p>Provide unwrapping proxies for some methods used in engine operations
|
||
such as arithmetic and JSON stringification.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>_$<span class="hljs-number">1.</span>prototype.<span class="hljs-property">valueOf</span> = _$<span class="hljs-number">1.</span>prototype.<span class="hljs-property">toJSON</span> = _$<span class="hljs-number">1.</span>prototype.<span class="hljs-property">value</span>;
|
||
|
||
_$<span class="hljs-number">1.</span>prototype.<span class="hljs-property">toString</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title class_">String</span>(<span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span>);
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-45">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-45">¶</a>
|
||
</div>
|
||
<p>Internal function to wrap or shallow-copy an ArrayBuffer,
|
||
typed array or DataView to a new view, reusing the buffer.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">toBufferView</span>(<span class="hljs-params">bufferSource</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Uint8Array</span>(
|
||
bufferSource.<span class="hljs-property">buffer</span> || bufferSource,
|
||
bufferSource.<span class="hljs-property">byteOffset</span> || <span class="hljs-number">0</span>,
|
||
<span class="hljs-title function_">getByteLength</span>(bufferSource)
|
||
);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-46">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-46">¶</a>
|
||
</div>
|
||
<p>We use this string twice, so give it a name for minification.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> tagDataView = <span class="hljs-string">'[object DataView]'</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-47">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-47">¶</a>
|
||
</div>
|
||
<p>Internal recursive comparison function for <code>_.isEqual</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">eq</span>(<span class="hljs-params">a, b, aStack, bStack</span>) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-48">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-48">¶</a>
|
||
</div>
|
||
<p>Identical objects are equal. <code>0 === -0</code>, but they aren’t identical.
|
||
See the <a href="https://wiki.ecmascript.org/doku.php?id=harmony:egal">Harmony <code>egal</code> proposal</a>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (a === b) <span class="hljs-keyword">return</span> a !== <span class="hljs-number">0</span> || <span class="hljs-number">1</span> / a === <span class="hljs-number">1</span> / b;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-49">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-49">¶</a>
|
||
</div>
|
||
<p><code>null</code> or <code>undefined</code> only equal to itself (strict comparison).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (a == <span class="hljs-literal">null</span> || b == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-50">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-50">¶</a>
|
||
</div>
|
||
<p><code>NaN</code>s are equivalent, but non-reflexive.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (a !== a) <span class="hljs-keyword">return</span> b !== b;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-51">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-51">¶</a>
|
||
</div>
|
||
<p>Exhaust primitive checks</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> type = <span class="hljs-keyword">typeof</span> a;
|
||
<span class="hljs-keyword">if</span> (type !== <span class="hljs-string">'function'</span> && type !== <span class="hljs-string">'object'</span> && <span class="hljs-keyword">typeof</span> b != <span class="hljs-string">'object'</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">deepEq</span>(a, b, aStack, bStack);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-52">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-52">¶</a>
|
||
</div>
|
||
<p>Internal recursive comparison function for <code>_.isEqual</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">deepEq</span>(<span class="hljs-params">a, b, aStack, bStack</span>) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-53">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-53">¶</a>
|
||
</div>
|
||
<p>Unwrap any wrapped objects.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (a <span class="hljs-keyword">instanceof</span> _$<span class="hljs-number">1</span>) a = a.<span class="hljs-property">_wrapped</span>;
|
||
<span class="hljs-keyword">if</span> (b <span class="hljs-keyword">instanceof</span> _$<span class="hljs-number">1</span>) b = b.<span class="hljs-property">_wrapped</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-54">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-54">¶</a>
|
||
</div>
|
||
<p>Compare <code>[[Class]]</code> names.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> className = toString.<span class="hljs-title function_">call</span>(a);
|
||
<span class="hljs-keyword">if</span> (className !== toString.<span class="hljs-title function_">call</span>(b)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-55">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-55">¶</a>
|
||
</div>
|
||
<p>Work around a bug in IE 10 - Edge 13.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (hasStringTagBug && className == <span class="hljs-string">'[object Object]'</span> && <span class="hljs-title function_">isDataView$1</span>(a)) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isDataView$1</span>(b)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
className = tagDataView;
|
||
}
|
||
<span class="hljs-keyword">switch</span> (className) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-56">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-56">¶</a>
|
||
</div>
|
||
<p>These types are compared by value.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">'[object RegExp]'</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-57">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-57">¶</a>
|
||
</div>
|
||
<p>RegExps are coerced to strings for comparison (Note: ‘’ + /a/i === ‘/a/i’)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-string">'[object String]'</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-58">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-58">¶</a>
|
||
</div>
|
||
<p>Primitives and their corresponding object wrappers are equivalent; thus, <code>"5"</code> is
|
||
equivalent to <code>new String("5")</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-string">''</span> + a === <span class="hljs-string">''</span> + b;
|
||
<span class="hljs-keyword">case</span> <span class="hljs-string">'[object Number]'</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-59">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-59">¶</a>
|
||
</div>
|
||
<p><code>NaN</code>s are equivalent, but non-reflexive.
|
||
Object(NaN) is equivalent to NaN.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (+a !== +a) <span class="hljs-keyword">return</span> +b !== +b;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-60">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-60">¶</a>
|
||
</div>
|
||
<p>An <code>egal</code> comparison is performed for other numeric values.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> +a === <span class="hljs-number">0</span> ? <span class="hljs-number">1</span> / +a === <span class="hljs-number">1</span> / b : +a === +b;
|
||
<span class="hljs-keyword">case</span> <span class="hljs-string">'[object Date]'</span>:
|
||
<span class="hljs-keyword">case</span> <span class="hljs-string">'[object Boolean]'</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-61">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-61">¶</a>
|
||
</div>
|
||
<p>Coerce dates and booleans to numeric primitive values. Dates are compared by their
|
||
millisecond representations. Note that invalid dates with millisecond representations
|
||
of <code>NaN</code> are not equivalent.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> +a === +b;
|
||
<span class="hljs-keyword">case</span> <span class="hljs-string">'[object Symbol]'</span>:
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title class_">SymbolProto</span>.<span class="hljs-property">valueOf</span>.<span class="hljs-title function_">call</span>(a) === <span class="hljs-title class_">SymbolProto</span>.<span class="hljs-property">valueOf</span>.<span class="hljs-title function_">call</span>(b);
|
||
<span class="hljs-keyword">case</span> <span class="hljs-string">'[object ArrayBuffer]'</span>:
|
||
<span class="hljs-keyword">case</span> <span class="hljs-attr">tagDataView</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-62">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-62">¶</a>
|
||
</div>
|
||
<p>Coerce to typed array so we can fall through.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-title function_">deepEq</span>(<span class="hljs-title function_">toBufferView</span>(a), <span class="hljs-title function_">toBufferView</span>(b), aStack, bStack);
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> areArrays = className === <span class="hljs-string">'[object Array]'</span>;
|
||
<span class="hljs-keyword">if</span> (!areArrays && <span class="hljs-title function_">isTypedArray$1</span>(a)) {
|
||
<span class="hljs-keyword">var</span> byteLength = <span class="hljs-title function_">getByteLength</span>(a);
|
||
<span class="hljs-keyword">if</span> (byteLength !== <span class="hljs-title function_">getByteLength</span>(b)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
<span class="hljs-keyword">if</span> (a.<span class="hljs-property">buffer</span> === b.<span class="hljs-property">buffer</span> && a.<span class="hljs-property">byteOffset</span> === b.<span class="hljs-property">byteOffset</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
|
||
areArrays = <span class="hljs-literal">true</span>;
|
||
}
|
||
<span class="hljs-keyword">if</span> (!areArrays) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> a != <span class="hljs-string">'object'</span> || <span class="hljs-keyword">typeof</span> b != <span class="hljs-string">'object'</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-63">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-63">¶</a>
|
||
</div>
|
||
<p>Objects with different constructors are not equivalent, but <code>Object</code>s or <code>Array</code>s
|
||
from different frames are.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> aCtor = a.<span class="hljs-property">constructor</span>, bCtor = b.<span class="hljs-property">constructor</span>;
|
||
<span class="hljs-keyword">if</span> (aCtor !== bCtor && !(<span class="hljs-title function_">isFunction$1</span>(aCtor) && aCtor <span class="hljs-keyword">instanceof</span> aCtor &&
|
||
<span class="hljs-title function_">isFunction$1</span>(bCtor) && bCtor <span class="hljs-keyword">instanceof</span> bCtor)
|
||
&& (<span class="hljs-string">'constructor'</span> <span class="hljs-keyword">in</span> a && <span class="hljs-string">'constructor'</span> <span class="hljs-keyword">in</span> b)) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-64">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-64">¶</a>
|
||
</div>
|
||
<p>Assume equality for cyclic structures. The algorithm for detecting cyclic
|
||
structures is adapted from ES 5.1 section 15.12.3, abstract operation <code>JO</code>.</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-65">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-65">¶</a>
|
||
</div>
|
||
<p>Initializing stack of traversed objects.
|
||
It’s done here since we only need them for objects and arrays comparison.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> aStack = aStack || [];
|
||
bStack = bStack || [];
|
||
<span class="hljs-keyword">var</span> length = aStack.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">while</span> (length--) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-66">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-66">¶</a>
|
||
</div>
|
||
<p>Linear search. Performance is inversely proportional to the number of
|
||
unique nested structures.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (aStack[length] === a) <span class="hljs-keyword">return</span> bStack[length] === b;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-67">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-67">¶</a>
|
||
</div>
|
||
<p>Add the first object to the stack of traversed objects.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> aStack.<span class="hljs-title function_">push</span>(a);
|
||
bStack.<span class="hljs-title function_">push</span>(b);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-68">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-68">¶</a>
|
||
</div>
|
||
<p>Recursively compare objects and arrays.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (areArrays) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-69">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-69">¶</a>
|
||
</div>
|
||
<p>Compare array lengths to determine if a deep comparison is necessary.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> length = a.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">if</span> (length !== b.<span class="hljs-property">length</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-70">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-70">¶</a>
|
||
</div>
|
||
<p>Deep compare the contents, ignoring non-numeric properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">while</span> (length--) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">eq</span>(a[length], b[length], aStack, bStack)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}
|
||
} <span class="hljs-keyword">else</span> {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-71">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-71">¶</a>
|
||
</div>
|
||
<p>Deep compare objects.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(a), key;
|
||
length = _keys.<span class="hljs-property">length</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-72">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-72">¶</a>
|
||
</div>
|
||
<p>Ensure that both objects contain the same number of properties before comparing deep equality.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-title function_">keys</span>(b).<span class="hljs-property">length</span> !== length) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
<span class="hljs-keyword">while</span> (length--) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-73">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-73">¶</a>
|
||
</div>
|
||
<p>Deep compare each member</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> key = _keys[length];
|
||
<span class="hljs-keyword">if</span> (!(<span class="hljs-title function_">has$1</span>(b, key) && <span class="hljs-title function_">eq</span>(a[key], b[key], aStack, bStack))) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-74">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-74">¶</a>
|
||
</div>
|
||
<p>Remove the first object from the stack of traversed objects.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> aStack.<span class="hljs-title function_">pop</span>();
|
||
bStack.<span class="hljs-title function_">pop</span>();
|
||
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-75">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-75">¶</a>
|
||
</div>
|
||
<p>Perform a deep comparison to check if two objects are equal.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">isEqual</span>(<span class="hljs-params">a, b</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">eq</span>(a, b);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-76">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-76">¶</a>
|
||
</div>
|
||
<p>Retrieve all the enumerable property names of an object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">allKeys</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isObject</span>(obj)) <span class="hljs-keyword">return</span> [];
|
||
<span class="hljs-keyword">var</span> keys = [];
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> key <span class="hljs-keyword">in</span> obj) keys.<span class="hljs-title function_">push</span>(key);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-77">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-77">¶</a>
|
||
</div>
|
||
<p>Ahem, IE < 9.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (hasEnumBug) <span class="hljs-title function_">collectNonEnumProps</span>(obj, keys);
|
||
<span class="hljs-keyword">return</span> keys;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-78">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-78">¶</a>
|
||
</div>
|
||
<p>Since the regular <code>Object.prototype.toString</code> type tests don’t work for
|
||
some types in IE 11, we use a fingerprinting heuristic instead, based
|
||
on the methods. It’s not great, but it’s the best we got.
|
||
The fingerprint method lists are defined below.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">ie11fingerprint</span>(<span class="hljs-params">methods</span>) {
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-title function_">getLength</span>(methods);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-79">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-79">¶</a>
|
||
</div>
|
||
<p><code>Map</code>, <code>WeakMap</code> and <code>Set</code> have no enumerable keys.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> keys = <span class="hljs-title function_">allKeys</span>(obj);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">getLength</span>(keys)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isFunction$1</span>(obj[methods[i]])) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-80">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-80">¶</a>
|
||
</div>
|
||
<p>If we are testing against <code>WeakMap</code>, we need to ensure that
|
||
<code>obj</code> doesn’t have a <code>forEach</code> method in order to distinguish
|
||
it from a regular <code>Map</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> methods !== weakMapMethods || !<span class="hljs-title function_">isFunction$1</span>(obj[forEachName]);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-81">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-81">¶</a>
|
||
</div>
|
||
<p>In the interest of compact minification, we write
|
||
each string in the fingerprints only once.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> forEachName = <span class="hljs-string">'forEach'</span>,
|
||
hasName = <span class="hljs-string">'has'</span>,
|
||
commonInit = [<span class="hljs-string">'clear'</span>, <span class="hljs-string">'delete'</span>],
|
||
mapTail = [<span class="hljs-string">'get'</span>, hasName, <span class="hljs-string">'set'</span>];</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-82">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-82">¶</a>
|
||
</div>
|
||
<p><code>Map</code>, <code>WeakMap</code> and <code>Set</code> each have slightly different
|
||
combinations of the above sublists.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> mapMethods = commonInit.<span class="hljs-title function_">concat</span>(forEachName, mapTail),
|
||
weakMapMethods = commonInit.<span class="hljs-title function_">concat</span>(mapTail),
|
||
setMethods = [<span class="hljs-string">'add'</span>].<span class="hljs-title function_">concat</span>(commonInit, forEachName, hasName);
|
||
|
||
<span class="hljs-keyword">var</span> isMap = isIE11 ? <span class="hljs-title function_">ie11fingerprint</span>(mapMethods) : <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Map'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isWeakMap = isIE11 ? <span class="hljs-title function_">ie11fingerprint</span>(weakMapMethods) : <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'WeakMap'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isSet = isIE11 ? <span class="hljs-title function_">ie11fingerprint</span>(setMethods) : <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'Set'</span>);
|
||
|
||
<span class="hljs-keyword">var</span> isWeakSet = <span class="hljs-title function_">tagTester</span>(<span class="hljs-string">'WeakSet'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-83">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-83">¶</a>
|
||
</div>
|
||
<p>Retrieve the values of an object’s properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">values</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj);
|
||
<span class="hljs-keyword">var</span> length = _keys.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">var</span> values = <span class="hljs-title class_">Array</span>(length);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
values[i] = obj[_keys[i]];
|
||
}
|
||
<span class="hljs-keyword">return</span> values;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-84">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-84">¶</a>
|
||
</div>
|
||
<p>Convert an object into a list of <code>[key, value]</code> pairs.
|
||
The opposite of <code>_.object</code> with one argument.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">pairs</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj);
|
||
<span class="hljs-keyword">var</span> length = _keys.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">var</span> pairs = <span class="hljs-title class_">Array</span>(length);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
pairs[i] = [_keys[i], obj[_keys[i]]];
|
||
}
|
||
<span class="hljs-keyword">return</span> pairs;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-85">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-85">¶</a>
|
||
</div>
|
||
<p>Invert the keys and values of an object. The values must be serializable.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">invert</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> result = {};
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = _keys.<span class="hljs-property">length</span>; i < length; i++) {
|
||
result[obj[_keys[i]]] = _keys[i];
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-86">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-86">¶</a>
|
||
</div>
|
||
<p>Return a sorted list of the function names available on the object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">functions</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> names = [];
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> key <span class="hljs-keyword">in</span> obj) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFunction$1</span>(obj[key])) names.<span class="hljs-title function_">push</span>(key);
|
||
}
|
||
<span class="hljs-keyword">return</span> names.<span class="hljs-title function_">sort</span>();
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-87">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-87">¶</a>
|
||
</div>
|
||
<p>An internal function for creating assigner functions.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createAssigner</span>(<span class="hljs-params">keysFunc, defaults</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">if</span> (defaults) obj = <span class="hljs-title class_">Object</span>(obj);
|
||
<span class="hljs-keyword">if</span> (length < <span class="hljs-number">2</span> || obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> obj;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">1</span>; index < length; index++) {
|
||
<span class="hljs-keyword">var</span> source = <span class="hljs-variable language_">arguments</span>[index],
|
||
keys = <span class="hljs-title function_">keysFunc</span>(source),
|
||
l = keys.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < l; i++) {
|
||
<span class="hljs-keyword">var</span> key = keys[i];
|
||
<span class="hljs-keyword">if</span> (!defaults || obj[key] === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) obj[key] = source[key];
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> obj;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-88">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-88">¶</a>
|
||
</div>
|
||
<p>Extend a given object with all the properties in passed-in object(s).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> extend = <span class="hljs-title function_">createAssigner</span>(allKeys);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-89">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-89">¶</a>
|
||
</div>
|
||
<p>Assigns a given object with all the own properties in the passed-in
|
||
object(s).
|
||
(<a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign">https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign</a>)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> extendOwn = <span class="hljs-title function_">createAssigner</span>(keys);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-90">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-90">¶</a>
|
||
</div>
|
||
<p>Fill in a given object with default properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> defaults = <span class="hljs-title function_">createAssigner</span>(allKeys, <span class="hljs-literal">true</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-91">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-91">¶</a>
|
||
</div>
|
||
<p>Create a naked function reference for surrogate-prototype-swapping.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">ctor</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>){};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-92">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-92">¶</a>
|
||
</div>
|
||
<p>An internal function for creating a new object that inherits from another.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">baseCreate</span>(<span class="hljs-params">prototype</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isObject</span>(prototype)) <span class="hljs-keyword">return</span> {};
|
||
<span class="hljs-keyword">if</span> (nativeCreate) <span class="hljs-keyword">return</span> <span class="hljs-title function_">nativeCreate</span>(prototype);
|
||
<span class="hljs-keyword">var</span> <span class="hljs-title class_">Ctor</span> = <span class="hljs-title function_">ctor</span>();
|
||
<span class="hljs-title class_">Ctor</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span> = prototype;
|
||
<span class="hljs-keyword">var</span> result = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Ctor</span>;
|
||
<span class="hljs-title class_">Ctor</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span> = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-93">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-93">¶</a>
|
||
</div>
|
||
<p>Creates an object that inherits from the given prototype object.
|
||
If additional properties are provided then they will be added to the
|
||
created object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">create</span>(<span class="hljs-params">prototype, props</span>) {
|
||
<span class="hljs-keyword">var</span> result = <span class="hljs-title function_">baseCreate</span>(prototype);
|
||
<span class="hljs-keyword">if</span> (props) <span class="hljs-title function_">extendOwn</span>(result, props);
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-94">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-94">¶</a>
|
||
</div>
|
||
<p>Create a (shallow-cloned) duplicate of an object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">clone</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isObject</span>(obj)) <span class="hljs-keyword">return</span> obj;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isArray</span>(obj) ? obj.<span class="hljs-title function_">slice</span>() : <span class="hljs-title function_">extend</span>({}, obj);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-95">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-95">¶</a>
|
||
</div>
|
||
<p>Invokes <code>interceptor</code> with the <code>obj</code> and then returns <code>obj</code>.
|
||
The primary purpose of this method is to “tap into” a method chain, in
|
||
order to perform operations on intermediate results within the chain.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">tap</span>(<span class="hljs-params">obj, interceptor</span>) {
|
||
<span class="hljs-title function_">interceptor</span>(obj);
|
||
<span class="hljs-keyword">return</span> obj;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-96">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-96">¶</a>
|
||
</div>
|
||
<p>Normalize a (deep) property <code>path</code> to array.
|
||
Like <code>_.iteratee</code>, this function can be customized.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">toPath$1</span>(<span class="hljs-params">path</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isArray</span>(path) ? path : [path];
|
||
}
|
||
_$<span class="hljs-number">1.</span>toPath = toPath$<span class="hljs-number">1</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-97">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-97">¶</a>
|
||
</div>
|
||
<p>Internal wrapper for <code>_.toPath</code> to enable minification.
|
||
Similar to <code>cb</code> for <code>_.iteratee</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">toPath</span>(<span class="hljs-params">path</span>) {
|
||
<span class="hljs-keyword">return</span> _$<span class="hljs-number">1.</span><span class="hljs-title function_">toPath</span>(path);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-98">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-98">¶</a>
|
||
</div>
|
||
<p>Internal function to obtain a nested property in <code>obj</code> along <code>path</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">deepGet</span>(<span class="hljs-params">obj, path</span>) {
|
||
<span class="hljs-keyword">var</span> length = path.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
|
||
obj = obj[path[i]];
|
||
}
|
||
<span class="hljs-keyword">return</span> length ? obj : <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-99">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-99">¶</a>
|
||
</div>
|
||
<p>Get the value of the (deep) property on <code>path</code> from <code>object</code>.
|
||
If any property in <code>path</code> does not exist or if the value is
|
||
<code>undefined</code>, return <code>defaultValue</code> instead.
|
||
The <code>path</code> is normalized through <code>_.toPath</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">get</span>(<span class="hljs-params">object, path, defaultValue</span>) {
|
||
<span class="hljs-keyword">var</span> value = <span class="hljs-title function_">deepGet</span>(object, <span class="hljs-title function_">toPath</span>(path));
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isUndefined</span>(value) ? defaultValue : value;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-100">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-100">¶</a>
|
||
</div>
|
||
<p>Shortcut function for checking if an object has a given property directly on
|
||
itself (in other words, not on a prototype). Unlike the internal <code>has</code>
|
||
function, this public version can also traverse nested properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">has</span>(<span class="hljs-params">obj, path</span>) {
|
||
path = <span class="hljs-title function_">toPath</span>(path);
|
||
<span class="hljs-keyword">var</span> length = path.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
<span class="hljs-keyword">var</span> key = path[i];
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">has$1</span>(obj, key)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
obj = obj[key];
|
||
}
|
||
<span class="hljs-keyword">return</span> !!length;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-101">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-101">¶</a>
|
||
</div>
|
||
<p>Keep the identity function around for default iteratees.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">identity</span>(<span class="hljs-params">value</span>) {
|
||
<span class="hljs-keyword">return</span> value;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-102">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-102">¶</a>
|
||
</div>
|
||
<p>Returns a predicate for checking whether an object has a given set of
|
||
<code>key:value</code> pairs.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">matcher</span>(<span class="hljs-params">attrs</span>) {
|
||
attrs = <span class="hljs-title function_">extendOwn</span>({}, attrs);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isMatch</span>(obj, attrs);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-103">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-103">¶</a>
|
||
</div>
|
||
<p>Creates a function that, when passed an object, will traverse that object’s
|
||
properties down the given <code>path</code>, specified as an array of keys or indices.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">property</span>(<span class="hljs-params">path</span>) {
|
||
path = <span class="hljs-title function_">toPath</span>(path);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">deepGet</span>(obj, path);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-104">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-104">¶</a>
|
||
</div>
|
||
<p>Internal function that returns an efficient (for current engines) version
|
||
of the passed-in callback, to be repeatedly applied in other Underscore
|
||
functions.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">optimizeCb</span>(<span class="hljs-params">func, context, argCount</span>) {
|
||
<span class="hljs-keyword">if</span> (context === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> func;
|
||
<span class="hljs-keyword">switch</span> (argCount == <span class="hljs-literal">null</span> ? <span class="hljs-number">3</span> : argCount) {
|
||
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(context, value);
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-105">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-105">¶</a>
|
||
</div>
|
||
<p>The 2-argument case is omitted because we’re not using it.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">case</span> <span class="hljs-number">3</span>: <span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">value, index, collection</span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(context, value, index, collection);
|
||
};
|
||
<span class="hljs-keyword">case</span> <span class="hljs-number">4</span>: <span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">accumulator, value, index, collection</span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">call</span>(context, accumulator, value, index, collection);
|
||
};
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">apply</span>(context, <span class="hljs-variable language_">arguments</span>);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-106">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-106">¶</a>
|
||
</div>
|
||
<p>An internal function to generate callbacks that can be applied to each
|
||
element in a collection, returning the desired result — either <code>_.identity</code>,
|
||
an arbitrary callback, a property matcher, or a property accessor.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">baseIteratee</span>(<span class="hljs-params">value, context, argCount</span>) {
|
||
<span class="hljs-keyword">if</span> (value == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> identity;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFunction$1</span>(value)) <span class="hljs-keyword">return</span> <span class="hljs-title function_">optimizeCb</span>(value, context, argCount);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isObject</span>(value) && !<span class="hljs-title function_">isArray</span>(value)) <span class="hljs-keyword">return</span> <span class="hljs-title function_">matcher</span>(value);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">property</span>(value);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-107">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-107">¶</a>
|
||
</div>
|
||
<p>External wrapper for our callback generator. Users may customize
|
||
<code>_.iteratee</code> if they want additional predicate/iteratee shorthand styles.
|
||
This abstraction hides the internal-only <code>argCount</code> argument.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">iteratee</span>(<span class="hljs-params">value, context</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">baseIteratee</span>(value, context, <span class="hljs-title class_">Infinity</span>);
|
||
}
|
||
_$<span class="hljs-number">1.</span>iteratee = iteratee;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-108">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-108">¶</a>
|
||
</div>
|
||
<p>The function we call internally to generate a callback. It invokes
|
||
<code>_.iteratee</code> if overridden, otherwise <code>baseIteratee</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">cb</span>(<span class="hljs-params">value, context, argCount</span>) {
|
||
<span class="hljs-keyword">if</span> (_$<span class="hljs-number">1.</span>iteratee !== iteratee) <span class="hljs-keyword">return</span> _$<span class="hljs-number">1.</span><span class="hljs-title function_">iteratee</span>(value, context);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">baseIteratee</span>(value, context, argCount);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-109">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-109">¶</a>
|
||
</div>
|
||
<p>Returns the results of applying the <code>iteratee</code> to each element of <code>obj</code>.
|
||
In contrast to <code>_.map</code> it returns an object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">mapObject</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj),
|
||
length = _keys.<span class="hljs-property">length</span>,
|
||
results = {};
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < length; index++) {
|
||
<span class="hljs-keyword">var</span> currentKey = _keys[index];
|
||
results[currentKey] = <span class="hljs-title function_">iteratee</span>(obj[currentKey], currentKey, obj);
|
||
}
|
||
<span class="hljs-keyword">return</span> results;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-110">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-110">¶</a>
|
||
</div>
|
||
<p>Predicate-generating function. Often useful outside of Underscore.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">noop</span>(<span class="hljs-params"></span>){}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-111">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-111">¶</a>
|
||
</div>
|
||
<p>Generates a function for a given object that returns a given property.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">propertyOf</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> noop;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">path</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">get</span>(obj, path);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-112">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-112">¶</a>
|
||
</div>
|
||
<p>Run a function <strong>n</strong> times.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">times</span>(<span class="hljs-params">n, iteratee, context</span>) {
|
||
<span class="hljs-keyword">var</span> accum = <span class="hljs-title class_">Array</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">0</span>, n));
|
||
iteratee = <span class="hljs-title function_">optimizeCb</span>(iteratee, context, <span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < n; i++) accum[i] = <span class="hljs-title function_">iteratee</span>(i);
|
||
<span class="hljs-keyword">return</span> accum;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-113">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-113">¶</a>
|
||
</div>
|
||
<p>Return a random integer between <code>min</code> and <code>max</code> (inclusive).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">random</span>(<span class="hljs-params">min, max</span>) {
|
||
<span class="hljs-keyword">if</span> (max == <span class="hljs-literal">null</span>) {
|
||
max = min;
|
||
min = <span class="hljs-number">0</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> min + <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">floor</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">random</span>() * (max - min + <span class="hljs-number">1</span>));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-114">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-114">¶</a>
|
||
</div>
|
||
<p>A (possibly faster) way to get the current timestamp as an integer.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> now = <span class="hljs-title class_">Date</span>.<span class="hljs-property">now</span> || <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Date</span>().<span class="hljs-title function_">getTime</span>();
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-115">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-115">¶</a>
|
||
</div>
|
||
<p>Internal helper to generate functions for escaping and unescaping strings
|
||
to/from HTML interpolation.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createEscaper</span>(<span class="hljs-params">map</span>) {
|
||
<span class="hljs-keyword">var</span> escaper = <span class="hljs-keyword">function</span>(<span class="hljs-params">match</span>) {
|
||
<span class="hljs-keyword">return</span> map[match];
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-116">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-116">¶</a>
|
||
</div>
|
||
<p>Regexes for identifying a key that needs to be escaped.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> source = <span class="hljs-string">'(?:'</span> + <span class="hljs-title function_">keys</span>(map).<span class="hljs-title function_">join</span>(<span class="hljs-string">'|'</span>) + <span class="hljs-string">')'</span>;
|
||
<span class="hljs-keyword">var</span> testRegexp = <span class="hljs-title class_">RegExp</span>(source);
|
||
<span class="hljs-keyword">var</span> replaceRegexp = <span class="hljs-title class_">RegExp</span>(source, <span class="hljs-string">'g'</span>);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">string</span>) {
|
||
string = string == <span class="hljs-literal">null</span> ? <span class="hljs-string">''</span> : <span class="hljs-string">''</span> + string;
|
||
<span class="hljs-keyword">return</span> testRegexp.<span class="hljs-title function_">test</span>(string) ? string.<span class="hljs-title function_">replace</span>(replaceRegexp, escaper) : string;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-117">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-117">¶</a>
|
||
</div>
|
||
<p>Internal list of HTML entities for escaping.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> escapeMap = {
|
||
<span class="hljs-string">'&'</span>: <span class="hljs-string">'&amp;'</span>,
|
||
<span class="hljs-string">'<'</span>: <span class="hljs-string">'&lt;'</span>,
|
||
<span class="hljs-string">'>'</span>: <span class="hljs-string">'&gt;'</span>,
|
||
<span class="hljs-string">'"'</span>: <span class="hljs-string">'&quot;'</span>,
|
||
<span class="hljs-string">"'"</span>: <span class="hljs-string">'&#x27;'</span>,
|
||
<span class="hljs-string">'`'</span>: <span class="hljs-string">'&#x60;'</span>
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-118">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-118">¶</a>
|
||
</div>
|
||
<p>Function for escaping strings to HTML interpolation.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> _escape = <span class="hljs-title function_">createEscaper</span>(escapeMap);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-119">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-119">¶</a>
|
||
</div>
|
||
<p>Internal list of HTML entities for unescaping.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> unescapeMap = <span class="hljs-title function_">invert</span>(escapeMap);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-120">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-120">¶</a>
|
||
</div>
|
||
<p>Function for unescaping strings from HTML interpolation.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> _unescape = <span class="hljs-title function_">createEscaper</span>(unescapeMap);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-121">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-121">¶</a>
|
||
</div>
|
||
<p>By default, Underscore uses ERB-style template delimiters. Change the
|
||
following template settings to use alternative delimiters.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> templateSettings = _$<span class="hljs-number">1.</span>templateSettings = {
|
||
<span class="hljs-attr">evaluate</span>: <span class="hljs-regexp">/<%([\s\S]+?)%>/g</span>,
|
||
<span class="hljs-attr">interpolate</span>: <span class="hljs-regexp">/<%=([\s\S]+?)%>/g</span>,
|
||
<span class="hljs-attr">escape</span>: <span class="hljs-regexp">/<%-([\s\S]+?)%>/g</span>
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-122">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-122">¶</a>
|
||
</div>
|
||
<p>When customizing <code>_.templateSettings</code>, if you don’t want to define an
|
||
interpolation, evaluation or escaping regex, we need one that is
|
||
guaranteed not to match.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> noMatch = <span class="hljs-regexp">/(.)^/</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-123">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-123">¶</a>
|
||
</div>
|
||
<p>Certain characters need to be escaped so that they can be put into a
|
||
string literal.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> escapes = {
|
||
<span class="hljs-string">"'"</span>: <span class="hljs-string">"'"</span>,
|
||
<span class="hljs-string">'\\'</span>: <span class="hljs-string">'\\'</span>,
|
||
<span class="hljs-string">'\r'</span>: <span class="hljs-string">'r'</span>,
|
||
<span class="hljs-string">'\n'</span>: <span class="hljs-string">'n'</span>,
|
||
<span class="hljs-string">'\u2028'</span>: <span class="hljs-string">'u2028'</span>,
|
||
<span class="hljs-string">'\u2029'</span>: <span class="hljs-string">'u2029'</span>
|
||
};
|
||
|
||
<span class="hljs-keyword">var</span> escapeRegExp = <span class="hljs-regexp">/\\|'|\r|\n|\u2028|\u2029/g</span>;
|
||
|
||
<span class="hljs-keyword">function</span> <span class="hljs-title function_">escapeChar</span>(<span class="hljs-params">match</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-string">'\\'</span> + escapes[match];
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-124">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-124">¶</a>
|
||
</div>
|
||
<p>In order to prevent third-party code injection through
|
||
<code>_.templateSettings.variable</code>, we test it against the following regular
|
||
expression. It is intentionally a bit more liberal than just matching valid
|
||
identifiers, but still prevents possible loopholes through defaults or
|
||
destructuring assignment.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> bareIdentifier = <span class="hljs-regexp">/^\s*(\w|\$)+\s*$/</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-125">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-125">¶</a>
|
||
</div>
|
||
<p>JavaScript micro-templating, similar to John Resig’s implementation.
|
||
Underscore templating handles arbitrary delimiters, preserves whitespace,
|
||
and correctly escapes quotes within interpolated code.
|
||
NB: <code>oldSettings</code> only exists for backwards compatibility.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">template</span>(<span class="hljs-params">text, settings, oldSettings</span>) {
|
||
<span class="hljs-keyword">if</span> (!settings && oldSettings) settings = oldSettings;
|
||
settings = <span class="hljs-title function_">defaults</span>({}, settings, _$<span class="hljs-number">1.</span>templateSettings);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-126">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-126">¶</a>
|
||
</div>
|
||
<p>Combine delimiters into one regular expression via alternation.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> matcher = <span class="hljs-title class_">RegExp</span>([
|
||
(settings.<span class="hljs-property">escape</span> || noMatch).<span class="hljs-property">source</span>,
|
||
(settings.<span class="hljs-property">interpolate</span> || noMatch).<span class="hljs-property">source</span>,
|
||
(settings.<span class="hljs-property">evaluate</span> || noMatch).<span class="hljs-property">source</span>
|
||
].<span class="hljs-title function_">join</span>(<span class="hljs-string">'|'</span>) + <span class="hljs-string">'|$'</span>, <span class="hljs-string">'g'</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-127">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-127">¶</a>
|
||
</div>
|
||
<p>Compile the template source, escaping string literals appropriately.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">var</span> source = <span class="hljs-string">"__p+='"</span>;
|
||
text.<span class="hljs-title function_">replace</span>(matcher, <span class="hljs-keyword">function</span>(<span class="hljs-params">match, <span class="hljs-built_in">escape</span>, interpolate, evaluate, offset</span>) {
|
||
source += text.<span class="hljs-title function_">slice</span>(index, offset).<span class="hljs-title function_">replace</span>(escapeRegExp, escapeChar);
|
||
index = offset + match.<span class="hljs-property">length</span>;
|
||
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-built_in">escape</span>) {
|
||
source += <span class="hljs-string">"'+\n((__t=("</span> + <span class="hljs-built_in">escape</span> + <span class="hljs-string">"))==null?'':_.escape(__t))+\n'"</span>;
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (interpolate) {
|
||
source += <span class="hljs-string">"'+\n((__t=("</span> + interpolate + <span class="hljs-string">"))==null?'':__t)+\n'"</span>;
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (evaluate) {
|
||
source += <span class="hljs-string">"';\n"</span> + evaluate + <span class="hljs-string">"\n__p+='"</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-128">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-128">¶</a>
|
||
</div>
|
||
<p>Adobe VMs need the match returned to produce the correct offset.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> match;
|
||
});
|
||
source += <span class="hljs-string">"';\n"</span>;
|
||
|
||
<span class="hljs-keyword">var</span> argument = settings.<span class="hljs-property">variable</span>;
|
||
<span class="hljs-keyword">if</span> (argument) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-129">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-129">¶</a>
|
||
</div>
|
||
<p>Insure against third-party code injection. (CVE-2021-23358)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!bareIdentifier.<span class="hljs-title function_">test</span>(argument)) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(
|
||
<span class="hljs-string">'variable is not a bare identifier: '</span> + argument
|
||
);
|
||
} <span class="hljs-keyword">else</span> {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-130">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-130">¶</a>
|
||
</div>
|
||
<p>If a variable is not specified, place data values in local scope.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> source = <span class="hljs-string">'with(obj||{}){\n'</span> + source + <span class="hljs-string">'}\n'</span>;
|
||
argument = <span class="hljs-string">'obj'</span>;
|
||
}
|
||
|
||
source = <span class="hljs-string">"var __t,__p='',__j=Array.prototype.join,"</span> +
|
||
<span class="hljs-string">"print=function(){__p+=__j.call(arguments,'');};\n"</span> +
|
||
source + <span class="hljs-string">'return __p;\n'</span>;
|
||
|
||
<span class="hljs-keyword">var</span> render;
|
||
<span class="hljs-keyword">try</span> {
|
||
render = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Function</span>(argument, <span class="hljs-string">'_'</span>, source);
|
||
} <span class="hljs-keyword">catch</span> (e) {
|
||
e.<span class="hljs-property">source</span> = source;
|
||
<span class="hljs-keyword">throw</span> e;
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> template = <span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>) {
|
||
<span class="hljs-keyword">return</span> render.<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, data, _$<span class="hljs-number">1</span>);
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-131">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-131">¶</a>
|
||
</div>
|
||
<p>Provide the compiled source as a convenience for precompilation.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> template.<span class="hljs-property">source</span> = <span class="hljs-string">'function('</span> + argument + <span class="hljs-string">'){\n'</span> + source + <span class="hljs-string">'}'</span>;
|
||
|
||
<span class="hljs-keyword">return</span> template;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-132">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-132">¶</a>
|
||
</div>
|
||
<p>Traverses the children of <code>obj</code> along <code>path</code>. If a child is a function, it
|
||
is invoked with its parent as context. Returns the value of the final
|
||
child, or <code>fallback</code> if any child is undefined.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">result</span>(<span class="hljs-params">obj, path, fallback</span>) {
|
||
path = <span class="hljs-title function_">toPath</span>(path);
|
||
<span class="hljs-keyword">var</span> length = path.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">if</span> (!length) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isFunction$1</span>(fallback) ? fallback.<span class="hljs-title function_">call</span>(obj) : fallback;
|
||
}
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
<span class="hljs-keyword">var</span> prop = obj == <span class="hljs-literal">null</span> ? <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> : obj[path[i]];
|
||
<span class="hljs-keyword">if</span> (prop === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) {
|
||
prop = fallback;
|
||
i = length; <span class="hljs-comment">// Ensure we don't continue iterating.</span>
|
||
}
|
||
obj = <span class="hljs-title function_">isFunction$1</span>(prop) ? prop.<span class="hljs-title function_">call</span>(obj) : prop;
|
||
}
|
||
<span class="hljs-keyword">return</span> obj;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-133">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-133">¶</a>
|
||
</div>
|
||
<p>Generate a unique integer id (unique within the entire client session).
|
||
Useful for temporary DOM ids.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> idCounter = <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">function</span> <span class="hljs-title function_">uniqueId</span>(<span class="hljs-params">prefix</span>) {
|
||
<span class="hljs-keyword">var</span> id = ++idCounter + <span class="hljs-string">''</span>;
|
||
<span class="hljs-keyword">return</span> prefix ? prefix + id : id;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-134">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-134">¶</a>
|
||
</div>
|
||
<p>Start chaining a wrapped Underscore object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">chain</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">var</span> instance = <span class="hljs-title function_">_$1</span>(obj);
|
||
instance.<span class="hljs-property">_chain</span> = <span class="hljs-literal">true</span>;
|
||
<span class="hljs-keyword">return</span> instance;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-135">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-135">¶</a>
|
||
</div>
|
||
<p>Internal function to execute <code>sourceFunc</code> bound to <code>context</code> with optional
|
||
<code>args</code>. Determines whether to execute a function as a constructor or as a
|
||
normal function.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">executeBound</span>(<span class="hljs-params">sourceFunc, boundFunc, context, callingContext, args</span>) {
|
||
<span class="hljs-keyword">if</span> (!(callingContext <span class="hljs-keyword">instanceof</span> boundFunc)) <span class="hljs-keyword">return</span> sourceFunc.<span class="hljs-title function_">apply</span>(context, args);
|
||
<span class="hljs-keyword">var</span> self = <span class="hljs-title function_">baseCreate</span>(sourceFunc.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>);
|
||
<span class="hljs-keyword">var</span> result = sourceFunc.<span class="hljs-title function_">apply</span>(self, args);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isObject</span>(result)) <span class="hljs-keyword">return</span> result;
|
||
<span class="hljs-keyword">return</span> self;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-136">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-136">¶</a>
|
||
</div>
|
||
<p>Partially apply a function by creating a version that has had some of its
|
||
arguments pre-filled, without changing its dynamic <code>this</code> context. <code>_</code> acts
|
||
as a placeholder by default, allowing any combination of arguments to be
|
||
pre-filled. Set <code>_.partial.placeholder</code> for a custom placeholder argument.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> partial = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">func, boundArgs</span>) {
|
||
<span class="hljs-keyword">var</span> placeholder = partial.<span class="hljs-property">placeholder</span>;
|
||
<span class="hljs-keyword">var</span> bound = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> position = <span class="hljs-number">0</span>, length = boundArgs.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">var</span> args = <span class="hljs-title class_">Array</span>(length);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
|
||
args[i] = boundArgs[i] === placeholder ? <span class="hljs-variable language_">arguments</span>[position++] : boundArgs[i];
|
||
}
|
||
<span class="hljs-keyword">while</span> (position < <span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span>) args.<span class="hljs-title function_">push</span>(<span class="hljs-variable language_">arguments</span>[position++]);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">executeBound</span>(func, bound, <span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">this</span>, args);
|
||
};
|
||
<span class="hljs-keyword">return</span> bound;
|
||
});
|
||
|
||
partial.<span class="hljs-property">placeholder</span> = _$<span class="hljs-number">1</span>;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-137">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-137">¶</a>
|
||
</div>
|
||
<p>Create a function bound to a given object (assigning <code>this</code>, and arguments,
|
||
optionally).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> bind = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">func, context, args</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isFunction$1</span>(func)) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">TypeError</span>(<span class="hljs-string">'Bind must be called on a function'</span>);
|
||
<span class="hljs-keyword">var</span> bound = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">callArgs</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">executeBound</span>(func, bound, context, <span class="hljs-variable language_">this</span>, args.<span class="hljs-title function_">concat</span>(callArgs));
|
||
});
|
||
<span class="hljs-keyword">return</span> bound;
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-138">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-138">¶</a>
|
||
</div>
|
||
<p>Internal helper for collection methods to determine whether a collection
|
||
should be iterated as an array or as an object.
|
||
Related: <a href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength">https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength</a>
|
||
Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> isArrayLike = <span class="hljs-title function_">createSizePropertyCheck</span>(getLength);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-139">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-139">¶</a>
|
||
</div>
|
||
<p>Internal implementation of a recursive <code>flatten</code> function.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">flatten$1</span>(<span class="hljs-params">input, depth, strict, output</span>) {
|
||
output = output || [];
|
||
<span class="hljs-keyword">if</span> (!depth && depth !== <span class="hljs-number">0</span>) {
|
||
depth = <span class="hljs-title class_">Infinity</span>;
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (depth <= <span class="hljs-number">0</span>) {
|
||
<span class="hljs-keyword">return</span> output.<span class="hljs-title function_">concat</span>(input);
|
||
}
|
||
<span class="hljs-keyword">var</span> idx = output.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = <span class="hljs-title function_">getLength</span>(input); i < length; i++) {
|
||
<span class="hljs-keyword">var</span> value = input[i];
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isArrayLike</span>(value) && (<span class="hljs-title function_">isArray</span>(value) || <span class="hljs-title function_">isArguments$1</span>(value))) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-140">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-140">¶</a>
|
||
</div>
|
||
<p>Flatten current level of array or arguments object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (depth > <span class="hljs-number">1</span>) {
|
||
<span class="hljs-title function_">flatten$1</span>(value, depth - <span class="hljs-number">1</span>, strict, output);
|
||
idx = output.<span class="hljs-property">length</span>;
|
||
} <span class="hljs-keyword">else</span> {
|
||
<span class="hljs-keyword">var</span> j = <span class="hljs-number">0</span>, len = value.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">while</span> (j < len) output[idx++] = value[j++];
|
||
}
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!strict) {
|
||
output[idx++] = value;
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> output;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-141">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-141">¶</a>
|
||
</div>
|
||
<p>Bind a number of an object’s methods to that object. Remaining arguments
|
||
are the method names to be bound. Useful for ensuring that all callbacks
|
||
defined on an object belong to it.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> bindAll = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">obj, keys</span>) {
|
||
keys = <span class="hljs-title function_">flatten$1</span>(keys, <span class="hljs-literal">false</span>, <span class="hljs-literal">false</span>);
|
||
<span class="hljs-keyword">var</span> index = keys.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">if</span> (index < <span class="hljs-number">1</span>) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">'bindAll must be passed function names'</span>);
|
||
<span class="hljs-keyword">while</span> (index--) {
|
||
<span class="hljs-keyword">var</span> key = keys[index];
|
||
obj[key] = <span class="hljs-title function_">bind</span>(obj[key], obj);
|
||
}
|
||
<span class="hljs-keyword">return</span> obj;
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-142">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-142">¶</a>
|
||
</div>
|
||
<p>Memoize an expensive function by storing its results.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">memoize</span>(<span class="hljs-params">func, hasher</span>) {
|
||
<span class="hljs-keyword">var</span> memoize = <span class="hljs-keyword">function</span>(<span class="hljs-params">key</span>) {
|
||
<span class="hljs-keyword">var</span> cache = memoize.<span class="hljs-property">cache</span>;
|
||
<span class="hljs-keyword">var</span> address = <span class="hljs-string">''</span> + (hasher ? hasher.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>) : key);
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">has$1</span>(cache, address)) cache[address] = func.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>);
|
||
<span class="hljs-keyword">return</span> cache[address];
|
||
};
|
||
memoize.<span class="hljs-property">cache</span> = {};
|
||
<span class="hljs-keyword">return</span> memoize;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-143">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-143">¶</a>
|
||
</div>
|
||
<p>Delays a function for the given number of milliseconds, and then calls
|
||
it with the arguments supplied.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> delay = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">func, wait, args</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-built_in">setTimeout</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">apply</span>(<span class="hljs-literal">null</span>, args);
|
||
}, wait);
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-144">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-144">¶</a>
|
||
</div>
|
||
<p>Defers a function, scheduling it to run after the current call stack has
|
||
cleared.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> defer = <span class="hljs-title function_">partial</span>(delay, _$<span class="hljs-number">1</span>, <span class="hljs-number">1</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-145">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-145">¶</a>
|
||
</div>
|
||
<p>Returns a function, that, when invoked, will only be triggered at most once
|
||
during a given window of time. Normally, the throttled function will run
|
||
as much as it can, without ever going more than once per <code>wait</code> duration;
|
||
but if you’d like to disable the execution on the leading edge, pass
|
||
<code>{leading: false}</code>. To disable execution on the trailing edge, ditto.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">throttle</span>(<span class="hljs-params">func, wait, options</span>) {
|
||
<span class="hljs-keyword">var</span> timeout, context, args, result;
|
||
<span class="hljs-keyword">var</span> previous = <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">if</span> (!options) options = {};
|
||
|
||
<span class="hljs-keyword">var</span> later = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
previous = options.<span class="hljs-property">leading</span> === <span class="hljs-literal">false</span> ? <span class="hljs-number">0</span> : <span class="hljs-title function_">now</span>();
|
||
timeout = <span class="hljs-literal">null</span>;
|
||
result = func.<span class="hljs-title function_">apply</span>(context, args);
|
||
<span class="hljs-keyword">if</span> (!timeout) context = args = <span class="hljs-literal">null</span>;
|
||
};
|
||
|
||
<span class="hljs-keyword">var</span> throttled = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> _now = <span class="hljs-title function_">now</span>();
|
||
<span class="hljs-keyword">if</span> (!previous && options.<span class="hljs-property">leading</span> === <span class="hljs-literal">false</span>) previous = _now;
|
||
<span class="hljs-keyword">var</span> remaining = wait - (_now - previous);
|
||
context = <span class="hljs-variable language_">this</span>;
|
||
args = <span class="hljs-variable language_">arguments</span>;
|
||
<span class="hljs-keyword">if</span> (remaining <= <span class="hljs-number">0</span> || remaining > wait) {
|
||
<span class="hljs-keyword">if</span> (timeout) {
|
||
<span class="hljs-built_in">clearTimeout</span>(timeout);
|
||
timeout = <span class="hljs-literal">null</span>;
|
||
}
|
||
previous = _now;
|
||
result = func.<span class="hljs-title function_">apply</span>(context, args);
|
||
<span class="hljs-keyword">if</span> (!timeout) context = args = <span class="hljs-literal">null</span>;
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!timeout && options.<span class="hljs-property">trailing</span> !== <span class="hljs-literal">false</span>) {
|
||
timeout = <span class="hljs-built_in">setTimeout</span>(later, remaining);
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
};
|
||
|
||
throttled.<span class="hljs-property">cancel</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-built_in">clearTimeout</span>(timeout);
|
||
previous = <span class="hljs-number">0</span>;
|
||
timeout = context = args = <span class="hljs-literal">null</span>;
|
||
};
|
||
|
||
<span class="hljs-keyword">return</span> throttled;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-146">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-146">¶</a>
|
||
</div>
|
||
<p>When a sequence of calls of the returned function ends, the argument
|
||
function is triggered. The end of a sequence is defined by the <code>wait</code>
|
||
parameter. If <code>immediate</code> is passed, the argument function will be
|
||
triggered at the beginning of the sequence instead of at the end.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">debounce</span>(<span class="hljs-params">func, wait, immediate</span>) {
|
||
<span class="hljs-keyword">var</span> timeout, previous, args, result, context;
|
||
|
||
<span class="hljs-keyword">var</span> later = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> passed = <span class="hljs-title function_">now</span>() - previous;
|
||
<span class="hljs-keyword">if</span> (wait > passed) {
|
||
timeout = <span class="hljs-built_in">setTimeout</span>(later, wait - passed);
|
||
} <span class="hljs-keyword">else</span> {
|
||
timeout = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">if</span> (!immediate) result = func.<span class="hljs-title function_">apply</span>(context, args);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-147">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-147">¶</a>
|
||
</div>
|
||
<p>This check is needed because <code>func</code> can recursively invoke <code>debounced</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (!timeout) args = context = <span class="hljs-literal">null</span>;
|
||
}
|
||
};
|
||
|
||
<span class="hljs-keyword">var</span> debounced = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">_args</span>) {
|
||
context = <span class="hljs-variable language_">this</span>;
|
||
args = _args;
|
||
previous = <span class="hljs-title function_">now</span>();
|
||
<span class="hljs-keyword">if</span> (!timeout) {
|
||
timeout = <span class="hljs-built_in">setTimeout</span>(later, wait);
|
||
<span class="hljs-keyword">if</span> (immediate) result = func.<span class="hljs-title function_">apply</span>(context, args);
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
});
|
||
|
||
debounced.<span class="hljs-property">cancel</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-built_in">clearTimeout</span>(timeout);
|
||
timeout = args = context = <span class="hljs-literal">null</span>;
|
||
};
|
||
|
||
<span class="hljs-keyword">return</span> debounced;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-148">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-148">¶</a>
|
||
</div>
|
||
<p>Returns the first function passed as an argument to the second,
|
||
allowing you to adjust arguments, run code before and after, and
|
||
conditionally execute the original function.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">wrap</span>(<span class="hljs-params">func, wrapper</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">partial</span>(wrapper, func);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-149">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-149">¶</a>
|
||
</div>
|
||
<p>Returns a negated version of the passed-in predicate.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">negate</span>(<span class="hljs-params">predicate</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">return</span> !predicate.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-150">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-150">¶</a>
|
||
</div>
|
||
<p>Returns a function that is the composition of a list of functions, each
|
||
consuming the return value of the function that follows.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">compose</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> args = <span class="hljs-variable language_">arguments</span>;
|
||
<span class="hljs-keyword">var</span> start = args.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> i = start;
|
||
<span class="hljs-keyword">var</span> result = args[start].<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>);
|
||
<span class="hljs-keyword">while</span> (i--) result = args[i].<span class="hljs-title function_">call</span>(<span class="hljs-variable language_">this</span>, result);
|
||
<span class="hljs-keyword">return</span> result;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-151">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-151">¶</a>
|
||
</div>
|
||
<p>Returns a function that will only be executed on and after the Nth call.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">after</span>(<span class="hljs-params">times, func</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">if</span> (--times < <span class="hljs-number">1</span>) {
|
||
<span class="hljs-keyword">return</span> func.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>);
|
||
}
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-152">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-152">¶</a>
|
||
</div>
|
||
<p>Returns a function that will only be executed up to (but not including) the
|
||
Nth call.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">before</span>(<span class="hljs-params">times, func</span>) {
|
||
<span class="hljs-keyword">var</span> memo;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">if</span> (--times > <span class="hljs-number">0</span>) {
|
||
memo = func.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-variable language_">arguments</span>);
|
||
}
|
||
<span class="hljs-keyword">if</span> (times <= <span class="hljs-number">1</span>) func = <span class="hljs-literal">null</span>;
|
||
<span class="hljs-keyword">return</span> memo;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-153">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-153">¶</a>
|
||
</div>
|
||
<p>Returns a function that will be executed at most one time, no matter how
|
||
often you call it. Useful for lazy initialization.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> once = <span class="hljs-title function_">partial</span>(before, <span class="hljs-number">2</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-154">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-154">¶</a>
|
||
</div>
|
||
<p>Returns the first key on an object that passes a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">findKey</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
predicate = <span class="hljs-title function_">cb</span>(predicate, context);
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj), key;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = _keys.<span class="hljs-property">length</span>; i < length; i++) {
|
||
key = _keys[i];
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">predicate</span>(obj[key], key, obj)) <span class="hljs-keyword">return</span> key;
|
||
}
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-155">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-155">¶</a>
|
||
</div>
|
||
<p>Internal function to generate <code>_.findIndex</code> and <code>_.findLastIndex</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createPredicateIndexFinder</span>(<span class="hljs-params">dir</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">array, predicate, context</span>) {
|
||
predicate = <span class="hljs-title function_">cb</span>(predicate, context);
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-title function_">getLength</span>(array);
|
||
<span class="hljs-keyword">var</span> index = dir > <span class="hljs-number">0</span> ? <span class="hljs-number">0</span> : length - <span class="hljs-number">1</span>;
|
||
<span class="hljs-keyword">for</span> (; index >= <span class="hljs-number">0</span> && index < length; index += dir) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">predicate</span>(array[index], index, array)) <span class="hljs-keyword">return</span> index;
|
||
}
|
||
<span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-156">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-156">¶</a>
|
||
</div>
|
||
<p>Returns the first index on an array-like that passes a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> findIndex = <span class="hljs-title function_">createPredicateIndexFinder</span>(<span class="hljs-number">1</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-157">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-157">¶</a>
|
||
</div>
|
||
<p>Returns the last index on an array-like that passes a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> findLastIndex = <span class="hljs-title function_">createPredicateIndexFinder</span>(-<span class="hljs-number">1</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-158">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-158">¶</a>
|
||
</div>
|
||
<p>Use a comparator function to figure out the smallest index at which
|
||
an object should be inserted so as to maintain order. Uses binary search.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">sortedIndex</span>(<span class="hljs-params">array, obj, iteratee, context</span>) {
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context, <span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">var</span> value = <span class="hljs-title function_">iteratee</span>(obj);
|
||
<span class="hljs-keyword">var</span> low = <span class="hljs-number">0</span>, high = <span class="hljs-title function_">getLength</span>(array);
|
||
<span class="hljs-keyword">while</span> (low < high) {
|
||
<span class="hljs-keyword">var</span> mid = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">floor</span>((low + high) / <span class="hljs-number">2</span>);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">iteratee</span>(array[mid]) < value) low = mid + <span class="hljs-number">1</span>; <span class="hljs-keyword">else</span> high = mid;
|
||
}
|
||
<span class="hljs-keyword">return</span> low;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-159">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-159">¶</a>
|
||
</div>
|
||
<p>Internal function to generate the <code>_.indexOf</code> and <code>_.lastIndexOf</code> functions.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createIndexFinder</span>(<span class="hljs-params">dir, predicateFind, sortedIndex</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">array, item, idx</span>) {
|
||
<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = <span class="hljs-title function_">getLength</span>(array);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> idx == <span class="hljs-string">'number'</span>) {
|
||
<span class="hljs-keyword">if</span> (dir > <span class="hljs-number">0</span>) {
|
||
i = idx >= <span class="hljs-number">0</span> ? idx : <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(idx + length, i);
|
||
} <span class="hljs-keyword">else</span> {
|
||
length = idx >= <span class="hljs-number">0</span> ? <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(idx + <span class="hljs-number">1</span>, length) : idx + length + <span class="hljs-number">1</span>;
|
||
}
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (sortedIndex && idx && length) {
|
||
idx = <span class="hljs-title function_">sortedIndex</span>(array, item);
|
||
<span class="hljs-keyword">return</span> array[idx] === item ? idx : -<span class="hljs-number">1</span>;
|
||
}
|
||
<span class="hljs-keyword">if</span> (item !== item) {
|
||
idx = <span class="hljs-title function_">predicateFind</span>(slice.<span class="hljs-title function_">call</span>(array, i, length), isNaN$<span class="hljs-number">1</span>);
|
||
<span class="hljs-keyword">return</span> idx >= <span class="hljs-number">0</span> ? idx + i : -<span class="hljs-number">1</span>;
|
||
}
|
||
<span class="hljs-keyword">for</span> (idx = dir > <span class="hljs-number">0</span> ? i : length - <span class="hljs-number">1</span>; idx >= <span class="hljs-number">0</span> && idx < length; idx += dir) {
|
||
<span class="hljs-keyword">if</span> (array[idx] === item) <span class="hljs-keyword">return</span> idx;
|
||
}
|
||
<span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-160">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-160">¶</a>
|
||
</div>
|
||
<p>Return the position of the first occurrence of an item in an array,
|
||
or -1 if the item is not included in the array.
|
||
If the array is large and already in sort order, pass <code>true</code>
|
||
for <strong>isSorted</strong> to use binary search.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> indexOf = <span class="hljs-title function_">createIndexFinder</span>(<span class="hljs-number">1</span>, findIndex, sortedIndex);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-161">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-161">¶</a>
|
||
</div>
|
||
<p>Return the position of the last occurrence of an item in an array,
|
||
or -1 if the item is not included in the array.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> lastIndexOf = <span class="hljs-title function_">createIndexFinder</span>(-<span class="hljs-number">1</span>, findLastIndex);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-162">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-162">¶</a>
|
||
</div>
|
||
<p>Return the first value which passes a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">find</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
<span class="hljs-keyword">var</span> keyFinder = <span class="hljs-title function_">isArrayLike</span>(obj) ? findIndex : findKey;
|
||
<span class="hljs-keyword">var</span> key = <span class="hljs-title function_">keyFinder</span>(obj, predicate, context);
|
||
<span class="hljs-keyword">if</span> (key !== <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> && key !== -<span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> obj[key];
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-163">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-163">¶</a>
|
||
</div>
|
||
<p>Convenience version of a common use case of <code>_.find</code>: getting the first
|
||
object containing specific <code>key:value</code> pairs.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">findWhere</span>(<span class="hljs-params">obj, attrs</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">find</span>(obj, <span class="hljs-title function_">matcher</span>(attrs));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-164">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-164">¶</a>
|
||
</div>
|
||
<p>The cornerstone for collection functions, an <code>each</code>
|
||
implementation, aka <code>forEach</code>.
|
||
Handles raw objects in addition to array-likes. Treats all
|
||
sparse array-likes as if they were dense.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">each</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
iteratee = <span class="hljs-title function_">optimizeCb</span>(iteratee, context);
|
||
<span class="hljs-keyword">var</span> i, length;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isArrayLike</span>(obj)) {
|
||
<span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, length = obj.<span class="hljs-property">length</span>; i < length; i++) {
|
||
<span class="hljs-title function_">iteratee</span>(obj[i], i, obj);
|
||
}
|
||
} <span class="hljs-keyword">else</span> {
|
||
<span class="hljs-keyword">var</span> _keys = <span class="hljs-title function_">keys</span>(obj);
|
||
<span class="hljs-keyword">for</span> (i = <span class="hljs-number">0</span>, length = _keys.<span class="hljs-property">length</span>; i < length; i++) {
|
||
<span class="hljs-title function_">iteratee</span>(obj[_keys[i]], _keys[i], obj);
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> obj;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-165">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-165">¶</a>
|
||
</div>
|
||
<p>Return the results of applying the iteratee to each element.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">map</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-keyword">var</span> _keys = !<span class="hljs-title function_">isArrayLike</span>(obj) && <span class="hljs-title function_">keys</span>(obj),
|
||
length = (_keys || obj).<span class="hljs-property">length</span>,
|
||
results = <span class="hljs-title class_">Array</span>(length);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < length; index++) {
|
||
<span class="hljs-keyword">var</span> currentKey = _keys ? _keys[index] : index;
|
||
results[index] = <span class="hljs-title function_">iteratee</span>(obj[currentKey], currentKey, obj);
|
||
}
|
||
<span class="hljs-keyword">return</span> results;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-166">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-166">¶</a>
|
||
</div>
|
||
<p>Internal helper to create a reducing function, iterating left or right.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">createReduce</span>(<span class="hljs-params">dir</span>) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-167">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-167">¶</a>
|
||
</div>
|
||
<p>Wrap code that reassigns argument variables in a separate function than
|
||
the one that accesses <code>arguments.length</code> to avoid a perf hit. (#1991)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> reducer = <span class="hljs-keyword">function</span>(<span class="hljs-params">obj, iteratee, memo, initial</span>) {
|
||
<span class="hljs-keyword">var</span> _keys = !<span class="hljs-title function_">isArrayLike</span>(obj) && <span class="hljs-title function_">keys</span>(obj),
|
||
length = (_keys || obj).<span class="hljs-property">length</span>,
|
||
index = dir > <span class="hljs-number">0</span> ? <span class="hljs-number">0</span> : length - <span class="hljs-number">1</span>;
|
||
<span class="hljs-keyword">if</span> (!initial) {
|
||
memo = obj[_keys ? _keys[index] : index];
|
||
index += dir;
|
||
}
|
||
<span class="hljs-keyword">for</span> (; index >= <span class="hljs-number">0</span> && index < length; index += dir) {
|
||
<span class="hljs-keyword">var</span> currentKey = _keys ? _keys[index] : index;
|
||
memo = <span class="hljs-title function_">iteratee</span>(memo, obj[currentKey], currentKey, obj);
|
||
}
|
||
<span class="hljs-keyword">return</span> memo;
|
||
};
|
||
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj, iteratee, memo, context</span>) {
|
||
<span class="hljs-keyword">var</span> initial = <span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span> >= <span class="hljs-number">3</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">reducer</span>(obj, <span class="hljs-title function_">optimizeCb</span>(iteratee, context, <span class="hljs-number">4</span>), memo, initial);
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-168">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-168">¶</a>
|
||
</div>
|
||
<p><strong>Reduce</strong> builds up a single result from a list of values, aka <code>inject</code>,
|
||
or <code>foldl</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> reduce = <span class="hljs-title function_">createReduce</span>(<span class="hljs-number">1</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-169">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-169">¶</a>
|
||
</div>
|
||
<p>The right-associative version of reduce, also known as <code>foldr</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> reduceRight = <span class="hljs-title function_">createReduce</span>(-<span class="hljs-number">1</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-170">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-170">¶</a>
|
||
</div>
|
||
<p>Return all the elements that pass a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">filter</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
<span class="hljs-keyword">var</span> results = [];
|
||
predicate = <span class="hljs-title function_">cb</span>(predicate, context);
|
||
<span class="hljs-title function_">each</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">value, index, list</span>) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">predicate</span>(value, index, list)) results.<span class="hljs-title function_">push</span>(value);
|
||
});
|
||
<span class="hljs-keyword">return</span> results;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-171">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-171">¶</a>
|
||
</div>
|
||
<p>Return all the elements for which a truth test fails.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">reject</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">filter</span>(obj, <span class="hljs-title function_">negate</span>(<span class="hljs-title function_">cb</span>(predicate)), context);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-172">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-172">¶</a>
|
||
</div>
|
||
<p>Determine whether all of the elements pass a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">every</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
predicate = <span class="hljs-title function_">cb</span>(predicate, context);
|
||
<span class="hljs-keyword">var</span> _keys = !<span class="hljs-title function_">isArrayLike</span>(obj) && <span class="hljs-title function_">keys</span>(obj),
|
||
length = (_keys || obj).<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < length; index++) {
|
||
<span class="hljs-keyword">var</span> currentKey = _keys ? _keys[index] : index;
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">predicate</span>(obj[currentKey], currentKey, obj)) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-173">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-173">¶</a>
|
||
</div>
|
||
<p>Determine if at least one element in the object passes a truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">some</span>(<span class="hljs-params">obj, predicate, context</span>) {
|
||
predicate = <span class="hljs-title function_">cb</span>(predicate, context);
|
||
<span class="hljs-keyword">var</span> _keys = !<span class="hljs-title function_">isArrayLike</span>(obj) && <span class="hljs-title function_">keys</span>(obj),
|
||
length = (_keys || obj).<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < length; index++) {
|
||
<span class="hljs-keyword">var</span> currentKey = _keys ? _keys[index] : index;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">predicate</span>(obj[currentKey], currentKey, obj)) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-174">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-174">¶</a>
|
||
</div>
|
||
<p>Determine if the array or object contains a given item (using <code>===</code>).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">contains</span>(<span class="hljs-params">obj, item, fromIndex, guard</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isArrayLike</span>(obj)) obj = <span class="hljs-title function_">values</span>(obj);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> fromIndex != <span class="hljs-string">'number'</span> || guard) fromIndex = <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">indexOf</span>(obj, item, fromIndex) >= <span class="hljs-number">0</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-175">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-175">¶</a>
|
||
</div>
|
||
<p>Invoke a method (with arguments) on every item in a collection.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> invoke = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">obj, path, args</span>) {
|
||
<span class="hljs-keyword">var</span> contextPath, func;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFunction$1</span>(path)) {
|
||
func = path;
|
||
} <span class="hljs-keyword">else</span> {
|
||
path = <span class="hljs-title function_">toPath</span>(path);
|
||
contextPath = path.<span class="hljs-title function_">slice</span>(<span class="hljs-number">0</span>, -<span class="hljs-number">1</span>);
|
||
path = path[path.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>];
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">map</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">context</span>) {
|
||
<span class="hljs-keyword">var</span> method = func;
|
||
<span class="hljs-keyword">if</span> (!method) {
|
||
<span class="hljs-keyword">if</span> (contextPath && contextPath.<span class="hljs-property">length</span>) {
|
||
context = <span class="hljs-title function_">deepGet</span>(context, contextPath);
|
||
}
|
||
<span class="hljs-keyword">if</span> (context == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
|
||
method = context[path];
|
||
}
|
||
<span class="hljs-keyword">return</span> method == <span class="hljs-literal">null</span> ? method : method.<span class="hljs-title function_">apply</span>(context, args);
|
||
});
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-176">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-176">¶</a>
|
||
</div>
|
||
<p>Convenience version of a common use case of <code>_.map</code>: fetching a property.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">pluck</span>(<span class="hljs-params">obj, key</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">map</span>(obj, <span class="hljs-title function_">property</span>(key));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-177">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-177">¶</a>
|
||
</div>
|
||
<p>Convenience version of a common use case of <code>_.filter</code>: selecting only
|
||
objects containing specific <code>key:value</code> pairs.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">where</span>(<span class="hljs-params">obj, attrs</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">filter</span>(obj, <span class="hljs-title function_">matcher</span>(attrs));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-178">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-178">¶</a>
|
||
</div>
|
||
<p>Return the maximum element (or element-based computation).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">max</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
<span class="hljs-keyword">var</span> result = -<span class="hljs-title class_">Infinity</span>, lastComputed = -<span class="hljs-title class_">Infinity</span>,
|
||
value, computed;
|
||
<span class="hljs-keyword">if</span> (iteratee == <span class="hljs-literal">null</span> || (<span class="hljs-keyword">typeof</span> iteratee == <span class="hljs-string">'number'</span> && <span class="hljs-keyword">typeof</span> obj[<span class="hljs-number">0</span>] != <span class="hljs-string">'object'</span> && obj != <span class="hljs-literal">null</span>)) {
|
||
obj = <span class="hljs-title function_">isArrayLike</span>(obj) ? obj : <span class="hljs-title function_">values</span>(obj);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = obj.<span class="hljs-property">length</span>; i < length; i++) {
|
||
value = obj[i];
|
||
<span class="hljs-keyword">if</span> (value != <span class="hljs-literal">null</span> && value > result) {
|
||
result = value;
|
||
}
|
||
}
|
||
} <span class="hljs-keyword">else</span> {
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-title function_">each</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">v, index, list</span>) {
|
||
computed = <span class="hljs-title function_">iteratee</span>(v, index, list);
|
||
<span class="hljs-keyword">if</span> (computed > lastComputed || (computed === -<span class="hljs-title class_">Infinity</span> && result === -<span class="hljs-title class_">Infinity</span>)) {
|
||
result = v;
|
||
lastComputed = computed;
|
||
}
|
||
});
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-179">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-179">¶</a>
|
||
</div>
|
||
<p>Return the minimum element (or element-based computation).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">min</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
<span class="hljs-keyword">var</span> result = <span class="hljs-title class_">Infinity</span>, lastComputed = <span class="hljs-title class_">Infinity</span>,
|
||
value, computed;
|
||
<span class="hljs-keyword">if</span> (iteratee == <span class="hljs-literal">null</span> || (<span class="hljs-keyword">typeof</span> iteratee == <span class="hljs-string">'number'</span> && <span class="hljs-keyword">typeof</span> obj[<span class="hljs-number">0</span>] != <span class="hljs-string">'object'</span> && obj != <span class="hljs-literal">null</span>)) {
|
||
obj = <span class="hljs-title function_">isArrayLike</span>(obj) ? obj : <span class="hljs-title function_">values</span>(obj);
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = obj.<span class="hljs-property">length</span>; i < length; i++) {
|
||
value = obj[i];
|
||
<span class="hljs-keyword">if</span> (value != <span class="hljs-literal">null</span> && value < result) {
|
||
result = value;
|
||
}
|
||
}
|
||
} <span class="hljs-keyword">else</span> {
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-title function_">each</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">v, index, list</span>) {
|
||
computed = <span class="hljs-title function_">iteratee</span>(v, index, list);
|
||
<span class="hljs-keyword">if</span> (computed < lastComputed || (computed === <span class="hljs-title class_">Infinity</span> && result === <span class="hljs-title class_">Infinity</span>)) {
|
||
result = v;
|
||
lastComputed = computed;
|
||
}
|
||
});
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-180">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-180">¶</a>
|
||
</div>
|
||
<p>Safely create a real, live array from anything iterable.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> reStrSymbol = <span class="hljs-regexp">/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g</span>;
|
||
<span class="hljs-keyword">function</span> <span class="hljs-title function_">toArray</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (!obj) <span class="hljs-keyword">return</span> [];
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isArray</span>(obj)) <span class="hljs-keyword">return</span> slice.<span class="hljs-title function_">call</span>(obj);
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isString</span>(obj)) {</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-181">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-181">¶</a>
|
||
</div>
|
||
<p>Keep surrogate pair characters together.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> obj.<span class="hljs-title function_">match</span>(reStrSymbol);
|
||
}
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isArrayLike</span>(obj)) <span class="hljs-keyword">return</span> <span class="hljs-title function_">map</span>(obj, identity);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">values</span>(obj);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-182">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-182">¶</a>
|
||
</div>
|
||
<p>Sample <strong>n</strong> random values from a collection using the modern version of the
|
||
<a href="https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle">Fisher-Yates shuffle</a>.
|
||
If <strong>n</strong> is not specified, returns a single random element.
|
||
The internal <code>guard</code> argument allows it to work with <code>_.map</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">sample</span>(<span class="hljs-params">obj, n, guard</span>) {
|
||
<span class="hljs-keyword">if</span> (n == <span class="hljs-literal">null</span> || guard) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isArrayLike</span>(obj)) obj = <span class="hljs-title function_">values</span>(obj);
|
||
<span class="hljs-keyword">return</span> obj[<span class="hljs-title function_">random</span>(obj.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>)];
|
||
}
|
||
<span class="hljs-keyword">var</span> sample = <span class="hljs-title function_">toArray</span>(obj);
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-title function_">getLength</span>(sample);
|
||
n = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(n, length), <span class="hljs-number">0</span>);
|
||
<span class="hljs-keyword">var</span> last = length - <span class="hljs-number">1</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < n; index++) {
|
||
<span class="hljs-keyword">var</span> rand = <span class="hljs-title function_">random</span>(index, last);
|
||
<span class="hljs-keyword">var</span> temp = sample[index];
|
||
sample[index] = sample[rand];
|
||
sample[rand] = temp;
|
||
}
|
||
<span class="hljs-keyword">return</span> sample.<span class="hljs-title function_">slice</span>(<span class="hljs-number">0</span>, n);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-183">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-183">¶</a>
|
||
</div>
|
||
<p>Shuffle a collection.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">shuffle</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">sample</span>(obj, <span class="hljs-title class_">Infinity</span>);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-184">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-184">¶</a>
|
||
</div>
|
||
<p>Sort the object’s values by a criterion produced by an iteratee.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">sortBy</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>;
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">pluck</span>(<span class="hljs-title function_">map</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">value, key, list</span>) {
|
||
<span class="hljs-keyword">return</span> {
|
||
<span class="hljs-attr">value</span>: value,
|
||
<span class="hljs-attr">index</span>: index++,
|
||
<span class="hljs-attr">criteria</span>: <span class="hljs-title function_">iteratee</span>(value, key, list)
|
||
};
|
||
}).<span class="hljs-title function_">sort</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">left, right</span>) {
|
||
<span class="hljs-keyword">var</span> a = left.<span class="hljs-property">criteria</span>;
|
||
<span class="hljs-keyword">var</span> b = right.<span class="hljs-property">criteria</span>;
|
||
<span class="hljs-keyword">if</span> (a !== b) {
|
||
<span class="hljs-keyword">if</span> (a > b || a === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
|
||
<span class="hljs-keyword">if</span> (a < b || b === <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;
|
||
}
|
||
<span class="hljs-keyword">return</span> left.<span class="hljs-property">index</span> - right.<span class="hljs-property">index</span>;
|
||
}), <span class="hljs-string">'value'</span>);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-185">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-185">¶</a>
|
||
</div>
|
||
<p>An internal function used for aggregate “group by” operations.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">group</span>(<span class="hljs-params">behavior, partition</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-keyword">function</span>(<span class="hljs-params">obj, iteratee, context</span>) {
|
||
<span class="hljs-keyword">var</span> result = partition ? [[], []] : {};
|
||
iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-title function_">each</span>(obj, <span class="hljs-keyword">function</span>(<span class="hljs-params">value, index</span>) {
|
||
<span class="hljs-keyword">var</span> key = <span class="hljs-title function_">iteratee</span>(value, index, obj);
|
||
<span class="hljs-title function_">behavior</span>(result, value, key);
|
||
});
|
||
<span class="hljs-keyword">return</span> result;
|
||
};
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-186">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-186">¶</a>
|
||
</div>
|
||
<p>Groups the object’s values by a criterion. Pass either a string attribute
|
||
to group by, or a function that returns the criterion.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> groupBy = <span class="hljs-title function_">group</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">result, value, key</span>) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">has$1</span>(result, key)) result[key].<span class="hljs-title function_">push</span>(value); <span class="hljs-keyword">else</span> result[key] = [value];
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-187">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-187">¶</a>
|
||
</div>
|
||
<p>Indexes the object’s values by a criterion, similar to <code>_.groupBy</code>, but for
|
||
when you know that your index values will be unique.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> indexBy = <span class="hljs-title function_">group</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">result, value, key</span>) {
|
||
result[key] = value;
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-188">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-188">¶</a>
|
||
</div>
|
||
<p>Counts instances of an object that group by a certain criterion. Pass
|
||
either a string attribute to count by, or a function that returns the
|
||
criterion.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> countBy = <span class="hljs-title function_">group</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">result, value, key</span>) {
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">has$1</span>(result, key)) result[key]++; <span class="hljs-keyword">else</span> result[key] = <span class="hljs-number">1</span>;
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-189">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-189">¶</a>
|
||
</div>
|
||
<p>Split a collection into two arrays: one whose elements all pass the given
|
||
truth test, and one whose elements all do not pass the truth test.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> partition = <span class="hljs-title function_">group</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">result, value, pass</span>) {
|
||
result[pass ? <span class="hljs-number">0</span> : <span class="hljs-number">1</span>].<span class="hljs-title function_">push</span>(value);
|
||
}, <span class="hljs-literal">true</span>);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-190">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-190">¶</a>
|
||
</div>
|
||
<p>Return the number of elements in a collection.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">size</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">isArrayLike</span>(obj) ? obj.<span class="hljs-property">length</span> : <span class="hljs-title function_">keys</span>(obj).<span class="hljs-property">length</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-191">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-191">¶</a>
|
||
</div>
|
||
<p>Internal <code>_.pick</code> helper function to determine whether <code>key</code> is an enumerable
|
||
property name of <code>obj</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">keyInObj</span>(<span class="hljs-params">value, key, obj</span>) {
|
||
<span class="hljs-keyword">return</span> key <span class="hljs-keyword">in</span> obj;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-192">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-192">¶</a>
|
||
</div>
|
||
<p>Return a copy of the object only containing the allowed properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> pick = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">obj, keys</span>) {
|
||
<span class="hljs-keyword">var</span> result = {}, iteratee = keys[<span class="hljs-number">0</span>];
|
||
<span class="hljs-keyword">if</span> (obj == <span class="hljs-literal">null</span>) <span class="hljs-keyword">return</span> result;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFunction$1</span>(iteratee)) {
|
||
<span class="hljs-keyword">if</span> (keys.<span class="hljs-property">length</span> > <span class="hljs-number">1</span>) iteratee = <span class="hljs-title function_">optimizeCb</span>(iteratee, keys[<span class="hljs-number">1</span>]);
|
||
keys = <span class="hljs-title function_">allKeys</span>(obj);
|
||
} <span class="hljs-keyword">else</span> {
|
||
iteratee = keyInObj;
|
||
keys = <span class="hljs-title function_">flatten$1</span>(keys, <span class="hljs-literal">false</span>, <span class="hljs-literal">false</span>);
|
||
obj = <span class="hljs-title class_">Object</span>(obj);
|
||
}
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = keys.<span class="hljs-property">length</span>; i < length; i++) {
|
||
<span class="hljs-keyword">var</span> key = keys[i];
|
||
<span class="hljs-keyword">var</span> value = obj[key];
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">iteratee</span>(value, key, obj)) result[key] = value;
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-193">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-193">¶</a>
|
||
</div>
|
||
<p>Return a copy of the object without the disallowed properties.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> omit = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">obj, keys</span>) {
|
||
<span class="hljs-keyword">var</span> iteratee = keys[<span class="hljs-number">0</span>], context;
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">isFunction$1</span>(iteratee)) {
|
||
iteratee = <span class="hljs-title function_">negate</span>(iteratee);
|
||
<span class="hljs-keyword">if</span> (keys.<span class="hljs-property">length</span> > <span class="hljs-number">1</span>) context = keys[<span class="hljs-number">1</span>];
|
||
} <span class="hljs-keyword">else</span> {
|
||
keys = <span class="hljs-title function_">map</span>(<span class="hljs-title function_">flatten$1</span>(keys, <span class="hljs-literal">false</span>, <span class="hljs-literal">false</span>), <span class="hljs-title class_">String</span>);
|
||
iteratee = <span class="hljs-keyword">function</span>(<span class="hljs-params">value, key</span>) {
|
||
<span class="hljs-keyword">return</span> !<span class="hljs-title function_">contains</span>(keys, key);
|
||
};
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">pick</span>(obj, iteratee, context);
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-194">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-194">¶</a>
|
||
</div>
|
||
<p>Returns everything but the last entry of the array. Especially useful on
|
||
the arguments object. Passing <strong>n</strong> will return all the values in
|
||
the array, excluding the last N.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">initial</span>(<span class="hljs-params">array, n, guard</span>) {
|
||
<span class="hljs-keyword">return</span> slice.<span class="hljs-title function_">call</span>(array, <span class="hljs-number">0</span>, <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">0</span>, array.<span class="hljs-property">length</span> - (n == <span class="hljs-literal">null</span> || guard ? <span class="hljs-number">1</span> : n)));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-195">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-195">¶</a>
|
||
</div>
|
||
<p>Get the first element of an array. Passing <strong>n</strong> will return the first N
|
||
values in the array. The <strong>guard</strong> check allows it to work with <code>_.map</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">first</span>(<span class="hljs-params">array, n, guard</span>) {
|
||
<span class="hljs-keyword">if</span> (array == <span class="hljs-literal">null</span> || array.<span class="hljs-property">length</span> < <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> n == <span class="hljs-literal">null</span> || guard ? <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> : [];
|
||
<span class="hljs-keyword">if</span> (n == <span class="hljs-literal">null</span> || guard) <span class="hljs-keyword">return</span> array[<span class="hljs-number">0</span>];
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">initial</span>(array, array.<span class="hljs-property">length</span> - n);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-196">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-196">¶</a>
|
||
</div>
|
||
<p>Returns everything but the first entry of the <code>array</code>. Especially useful on
|
||
the <code>arguments</code> object. Passing an <strong>n</strong> will return the rest N values in the
|
||
<code>array</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">rest</span>(<span class="hljs-params">array, n, guard</span>) {
|
||
<span class="hljs-keyword">return</span> slice.<span class="hljs-title function_">call</span>(array, n == <span class="hljs-literal">null</span> || guard ? <span class="hljs-number">1</span> : n);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-197">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-197">¶</a>
|
||
</div>
|
||
<p>Get the last element of an array. Passing <strong>n</strong> will return the last N
|
||
values in the array.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">last</span>(<span class="hljs-params">array, n, guard</span>) {
|
||
<span class="hljs-keyword">if</span> (array == <span class="hljs-literal">null</span> || array.<span class="hljs-property">length</span> < <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> n == <span class="hljs-literal">null</span> || guard ? <span class="hljs-keyword">void</span> <span class="hljs-number">0</span> : [];
|
||
<span class="hljs-keyword">if</span> (n == <span class="hljs-literal">null</span> || guard) <span class="hljs-keyword">return</span> array[array.<span class="hljs-property">length</span> - <span class="hljs-number">1</span>];
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">rest</span>(array, <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">0</span>, array.<span class="hljs-property">length</span> - n));
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-198">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-198">¶</a>
|
||
</div>
|
||
<p>Trim out all falsy values from an array.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">compact</span>(<span class="hljs-params">array</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">filter</span>(array, <span class="hljs-title class_">Boolean</span>);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-199">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-199">¶</a>
|
||
</div>
|
||
<p>Flatten out an array, either recursively (by default), or up to <code>depth</code>.
|
||
Passing <code>true</code> or <code>false</code> as <code>depth</code> means <code>1</code> or <code>Infinity</code>, respectively.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">flatten</span>(<span class="hljs-params">array, depth</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">flatten$1</span>(array, depth, <span class="hljs-literal">false</span>);
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-200">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-200">¶</a>
|
||
</div>
|
||
<p>Take the difference between one array and a number of other arrays.
|
||
Only the elements present in just the first array will remain.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> difference = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">array, rest</span>) {
|
||
rest = <span class="hljs-title function_">flatten$1</span>(rest, <span class="hljs-literal">true</span>, <span class="hljs-literal">true</span>);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">filter</span>(array, <span class="hljs-keyword">function</span>(<span class="hljs-params">value</span>){
|
||
<span class="hljs-keyword">return</span> !<span class="hljs-title function_">contains</span>(rest, value);
|
||
});
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-201">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-201">¶</a>
|
||
</div>
|
||
<p>Return a version of the array that does not contain the specified value(s).</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> without = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">array, otherArrays</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">difference</span>(array, otherArrays);
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-202">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-202">¶</a>
|
||
</div>
|
||
<p>Produce a duplicate-free version of the array. If the array has already
|
||
been sorted, you have the option of using a faster algorithm.
|
||
The faster algorithm will not work with an iteratee if the iteratee
|
||
is not a one-to-one function, so providing an iteratee will disable
|
||
the faster algorithm.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">uniq</span>(<span class="hljs-params">array, isSorted, iteratee, context</span>) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">isBoolean</span>(isSorted)) {
|
||
context = iteratee;
|
||
iteratee = isSorted;
|
||
isSorted = <span class="hljs-literal">false</span>;
|
||
}
|
||
<span class="hljs-keyword">if</span> (iteratee != <span class="hljs-literal">null</span>) iteratee = <span class="hljs-title function_">cb</span>(iteratee, context);
|
||
<span class="hljs-keyword">var</span> result = [];
|
||
<span class="hljs-keyword">var</span> seen = [];
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = <span class="hljs-title function_">getLength</span>(array); i < length; i++) {
|
||
<span class="hljs-keyword">var</span> value = array[i],
|
||
computed = iteratee ? <span class="hljs-title function_">iteratee</span>(value, i, array) : value;
|
||
<span class="hljs-keyword">if</span> (isSorted && !iteratee) {
|
||
<span class="hljs-keyword">if</span> (!i || seen !== computed) result.<span class="hljs-title function_">push</span>(value);
|
||
seen = computed;
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (iteratee) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">contains</span>(seen, computed)) {
|
||
seen.<span class="hljs-title function_">push</span>(computed);
|
||
result.<span class="hljs-title function_">push</span>(value);
|
||
}
|
||
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!<span class="hljs-title function_">contains</span>(result, value)) {
|
||
result.<span class="hljs-title function_">push</span>(value);
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-203">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-203">¶</a>
|
||
</div>
|
||
<p>Produce an array that contains the union: each distinct element from all of
|
||
the passed-in arrays.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> union = <span class="hljs-title function_">restArguments</span>(<span class="hljs-keyword">function</span>(<span class="hljs-params">arrays</span>) {
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">uniq</span>(<span class="hljs-title function_">flatten$1</span>(arrays, <span class="hljs-literal">true</span>, <span class="hljs-literal">true</span>));
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-204">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-204">¶</a>
|
||
</div>
|
||
<p>Produce an array that contains every item shared between all the
|
||
passed-in arrays.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">intersection</span>(<span class="hljs-params">array</span>) {
|
||
<span class="hljs-keyword">var</span> result = [];
|
||
<span class="hljs-keyword">var</span> argsLength = <span class="hljs-variable language_">arguments</span>.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = <span class="hljs-title function_">getLength</span>(array); i < length; i++) {
|
||
<span class="hljs-keyword">var</span> item = array[i];
|
||
<span class="hljs-keyword">if</span> (<span class="hljs-title function_">contains</span>(result, item)) <span class="hljs-keyword">continue</span>;
|
||
<span class="hljs-keyword">var</span> j;
|
||
<span class="hljs-keyword">for</span> (j = <span class="hljs-number">1</span>; j < argsLength; j++) {
|
||
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_">contains</span>(<span class="hljs-variable language_">arguments</span>[j], item)) <span class="hljs-keyword">break</span>;
|
||
}
|
||
<span class="hljs-keyword">if</span> (j === argsLength) result.<span class="hljs-title function_">push</span>(item);
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-205">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-205">¶</a>
|
||
</div>
|
||
<p>Complement of zip. Unzip accepts an array of arrays and groups
|
||
each array’s elements on shared indices.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">unzip</span>(<span class="hljs-params">array</span>) {
|
||
<span class="hljs-keyword">var</span> length = (array && <span class="hljs-title function_">max</span>(array, getLength).<span class="hljs-property">length</span>) || <span class="hljs-number">0</span>;
|
||
<span class="hljs-keyword">var</span> result = <span class="hljs-title class_">Array</span>(length);
|
||
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> index = <span class="hljs-number">0</span>; index < length; index++) {
|
||
result[index] = <span class="hljs-title function_">pluck</span>(array, index);
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-206">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-206">¶</a>
|
||
</div>
|
||
<p>Zip together multiple lists into a single array – elements that share
|
||
an index go together.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> zip = <span class="hljs-title function_">restArguments</span>(unzip);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-207">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-207">¶</a>
|
||
</div>
|
||
<p>Converts lists into objects. Pass either a single array of <code>[key, value]</code>
|
||
pairs, or two parallel arrays of the same length – one of keys, and one of
|
||
the corresponding values. Passing by pairs is the reverse of <code>_.pairs</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">object</span>(<span class="hljs-params">list, values</span>) {
|
||
<span class="hljs-keyword">var</span> result = {};
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = <span class="hljs-title function_">getLength</span>(list); i < length; i++) {
|
||
<span class="hljs-keyword">if</span> (values) {
|
||
result[list[i]] = values[i];
|
||
} <span class="hljs-keyword">else</span> {
|
||
result[list[i][<span class="hljs-number">0</span>]] = list[i][<span class="hljs-number">1</span>];
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-208">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-208">¶</a>
|
||
</div>
|
||
<p>Generate an integer Array containing an arithmetic progression. A port of
|
||
the native Python <code>range()</code> function. See
|
||
<a href="https://docs.python.org/library/functions.html#range">the Python documentation</a>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">range</span>(<span class="hljs-params">start, stop, step</span>) {
|
||
<span class="hljs-keyword">if</span> (stop == <span class="hljs-literal">null</span>) {
|
||
stop = start || <span class="hljs-number">0</span>;
|
||
start = <span class="hljs-number">0</span>;
|
||
}
|
||
<span class="hljs-keyword">if</span> (!step) {
|
||
step = stop < start ? -<span class="hljs-number">1</span> : <span class="hljs-number">1</span>;
|
||
}
|
||
|
||
<span class="hljs-keyword">var</span> length = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-title class_">Math</span>.<span class="hljs-title function_">ceil</span>((stop - start) / step), <span class="hljs-number">0</span>);
|
||
<span class="hljs-keyword">var</span> range = <span class="hljs-title class_">Array</span>(length);
|
||
|
||
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> idx = <span class="hljs-number">0</span>; idx < length; idx++, start += step) {
|
||
range[idx] = start;
|
||
}
|
||
|
||
<span class="hljs-keyword">return</span> range;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-209">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-209">¶</a>
|
||
</div>
|
||
<p>Chunk a single array into multiple arrays, each containing <code>count</code> or fewer
|
||
items.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">chunk</span>(<span class="hljs-params">array, count</span>) {
|
||
<span class="hljs-keyword">if</span> (count == <span class="hljs-literal">null</span> || count < <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> [];
|
||
<span class="hljs-keyword">var</span> result = [];
|
||
<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>, length = array.<span class="hljs-property">length</span>;
|
||
<span class="hljs-keyword">while</span> (i < length) {
|
||
result.<span class="hljs-title function_">push</span>(slice.<span class="hljs-title function_">call</span>(array, i, i += count));
|
||
}
|
||
<span class="hljs-keyword">return</span> result;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-210">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-210">¶</a>
|
||
</div>
|
||
<p>Helper function to continue chaining intermediate results.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">chainResult</span>(<span class="hljs-params">instance, obj</span>) {
|
||
<span class="hljs-keyword">return</span> instance.<span class="hljs-property">_chain</span> ? <span class="hljs-title function_">_$1</span>(obj).<span class="hljs-title function_">chain</span>() : obj;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-211">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-211">¶</a>
|
||
</div>
|
||
<p>Add your own custom functions to the Underscore object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">function</span> <span class="hljs-title function_">mixin</span>(<span class="hljs-params">obj</span>) {
|
||
<span class="hljs-title function_">each</span>(<span class="hljs-title function_">functions</span>(obj), <span class="hljs-keyword">function</span>(<span class="hljs-params">name</span>) {
|
||
<span class="hljs-keyword">var</span> func = _$<span class="hljs-number">1</span>[name] = obj[name];
|
||
_$<span class="hljs-number">1.</span>prototype[name] = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> args = [<span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span>];
|
||
push.<span class="hljs-title function_">apply</span>(args, <span class="hljs-variable language_">arguments</span>);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">chainResult</span>(<span class="hljs-variable language_">this</span>, func.<span class="hljs-title function_">apply</span>(_$<span class="hljs-number">1</span>, args));
|
||
};
|
||
});
|
||
<span class="hljs-keyword">return</span> _$<span class="hljs-number">1</span>;
|
||
}</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-212">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-212">¶</a>
|
||
</div>
|
||
<p>Add all mutator <code>Array</code> functions to the wrapper.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-title function_">each</span>([<span class="hljs-string">'pop'</span>, <span class="hljs-string">'push'</span>, <span class="hljs-string">'reverse'</span>, <span class="hljs-string">'shift'</span>, <span class="hljs-string">'sort'</span>, <span class="hljs-string">'splice'</span>, <span class="hljs-string">'unshift'</span>], <span class="hljs-keyword">function</span>(<span class="hljs-params">name</span>) {
|
||
<span class="hljs-keyword">var</span> method = <span class="hljs-title class_">ArrayProto</span>[name];
|
||
_$<span class="hljs-number">1.</span>prototype[name] = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> obj = <span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span>;
|
||
<span class="hljs-keyword">if</span> (obj != <span class="hljs-literal">null</span>) {
|
||
method.<span class="hljs-title function_">apply</span>(obj, <span class="hljs-variable language_">arguments</span>);
|
||
<span class="hljs-keyword">if</span> ((name === <span class="hljs-string">'shift'</span> || name === <span class="hljs-string">'splice'</span>) && obj.<span class="hljs-property">length</span> === <span class="hljs-number">0</span>) {
|
||
<span class="hljs-keyword">delete</span> obj[<span class="hljs-number">0</span>];
|
||
}
|
||
}
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">chainResult</span>(<span class="hljs-variable language_">this</span>, obj);
|
||
};
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-213">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-213">¶</a>
|
||
</div>
|
||
<p>Add all accessor <code>Array</code> functions to the wrapper.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-title function_">each</span>([<span class="hljs-string">'concat'</span>, <span class="hljs-string">'join'</span>, <span class="hljs-string">'slice'</span>], <span class="hljs-keyword">function</span>(<span class="hljs-params">name</span>) {
|
||
<span class="hljs-keyword">var</span> method = <span class="hljs-title class_">ArrayProto</span>[name];
|
||
_$<span class="hljs-number">1.</span>prototype[name] = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) {
|
||
<span class="hljs-keyword">var</span> obj = <span class="hljs-variable language_">this</span>.<span class="hljs-property">_wrapped</span>;
|
||
<span class="hljs-keyword">if</span> (obj != <span class="hljs-literal">null</span>) obj = method.<span class="hljs-title function_">apply</span>(obj, <span class="hljs-variable language_">arguments</span>);
|
||
<span class="hljs-keyword">return</span> <span class="hljs-title function_">chainResult</span>(<span class="hljs-variable language_">this</span>, obj);
|
||
};
|
||
});</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-214">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-214">¶</a>
|
||
</div>
|
||
<p>Named Exports</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>
|
||
<span class="hljs-keyword">var</span> allExports = {
|
||
<span class="hljs-attr">__proto__</span>: <span class="hljs-literal">null</span>,
|
||
<span class="hljs-attr">VERSION</span>: <span class="hljs-variable constant_">VERSION</span>,
|
||
<span class="hljs-attr">restArguments</span>: restArguments,
|
||
<span class="hljs-attr">isObject</span>: isObject,
|
||
<span class="hljs-attr">isNull</span>: isNull,
|
||
<span class="hljs-attr">isUndefined</span>: isUndefined,
|
||
<span class="hljs-attr">isBoolean</span>: isBoolean,
|
||
<span class="hljs-attr">isElement</span>: isElement,
|
||
<span class="hljs-attr">isString</span>: isString,
|
||
<span class="hljs-attr">isNumber</span>: isNumber,
|
||
<span class="hljs-attr">isDate</span>: isDate,
|
||
<span class="hljs-attr">isRegExp</span>: isRegExp,
|
||
<span class="hljs-attr">isError</span>: isError,
|
||
<span class="hljs-attr">isSymbol</span>: isSymbol,
|
||
<span class="hljs-attr">isArrayBuffer</span>: isArrayBuffer,
|
||
<span class="hljs-attr">isDataView</span>: isDataView$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isArray</span>: isArray,
|
||
<span class="hljs-attr">isFunction</span>: isFunction$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isArguments</span>: isArguments$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isFinite</span>: isFinite$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isNaN</span>: isNaN$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isTypedArray</span>: isTypedArray$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">isEmpty</span>: isEmpty,
|
||
<span class="hljs-attr">isMatch</span>: isMatch,
|
||
<span class="hljs-attr">isEqual</span>: isEqual,
|
||
<span class="hljs-attr">isMap</span>: isMap,
|
||
<span class="hljs-attr">isWeakMap</span>: isWeakMap,
|
||
<span class="hljs-attr">isSet</span>: isSet,
|
||
<span class="hljs-attr">isWeakSet</span>: isWeakSet,
|
||
<span class="hljs-attr">keys</span>: keys,
|
||
<span class="hljs-attr">allKeys</span>: allKeys,
|
||
<span class="hljs-attr">values</span>: values,
|
||
<span class="hljs-attr">pairs</span>: pairs,
|
||
<span class="hljs-attr">invert</span>: invert,
|
||
<span class="hljs-attr">functions</span>: functions,
|
||
<span class="hljs-attr">methods</span>: functions,
|
||
<span class="hljs-attr">extend</span>: extend,
|
||
<span class="hljs-attr">extendOwn</span>: extendOwn,
|
||
<span class="hljs-attr">assign</span>: extendOwn,
|
||
<span class="hljs-attr">defaults</span>: defaults,
|
||
<span class="hljs-attr">create</span>: create,
|
||
<span class="hljs-attr">clone</span>: clone,
|
||
<span class="hljs-attr">tap</span>: tap,
|
||
<span class="hljs-attr">get</span>: get,
|
||
<span class="hljs-attr">has</span>: has,
|
||
<span class="hljs-attr">mapObject</span>: mapObject,
|
||
<span class="hljs-attr">identity</span>: identity,
|
||
<span class="hljs-attr">constant</span>: constant,
|
||
<span class="hljs-attr">noop</span>: noop,
|
||
<span class="hljs-attr">toPath</span>: toPath$<span class="hljs-number">1</span>,
|
||
<span class="hljs-attr">property</span>: property,
|
||
<span class="hljs-attr">propertyOf</span>: propertyOf,
|
||
<span class="hljs-attr">matcher</span>: matcher,
|
||
<span class="hljs-attr">matches</span>: matcher,
|
||
<span class="hljs-attr">times</span>: times,
|
||
<span class="hljs-attr">random</span>: random,
|
||
<span class="hljs-attr">now</span>: now,
|
||
<span class="hljs-attr">escape</span>: _escape,
|
||
<span class="hljs-attr">unescape</span>: _unescape,
|
||
<span class="hljs-attr">templateSettings</span>: templateSettings,
|
||
<span class="hljs-attr">template</span>: template,
|
||
<span class="hljs-attr">result</span>: result,
|
||
<span class="hljs-attr">uniqueId</span>: uniqueId,
|
||
<span class="hljs-attr">chain</span>: chain,
|
||
<span class="hljs-attr">iteratee</span>: iteratee,
|
||
<span class="hljs-attr">partial</span>: partial,
|
||
<span class="hljs-attr">bind</span>: bind,
|
||
<span class="hljs-attr">bindAll</span>: bindAll,
|
||
<span class="hljs-attr">memoize</span>: memoize,
|
||
<span class="hljs-attr">delay</span>: delay,
|
||
<span class="hljs-attr">defer</span>: defer,
|
||
<span class="hljs-attr">throttle</span>: throttle,
|
||
<span class="hljs-attr">debounce</span>: debounce,
|
||
<span class="hljs-attr">wrap</span>: wrap,
|
||
<span class="hljs-attr">negate</span>: negate,
|
||
<span class="hljs-attr">compose</span>: compose,
|
||
<span class="hljs-attr">after</span>: after,
|
||
<span class="hljs-attr">before</span>: before,
|
||
<span class="hljs-attr">once</span>: once,
|
||
<span class="hljs-attr">findKey</span>: findKey,
|
||
<span class="hljs-attr">findIndex</span>: findIndex,
|
||
<span class="hljs-attr">findLastIndex</span>: findLastIndex,
|
||
<span class="hljs-attr">sortedIndex</span>: sortedIndex,
|
||
<span class="hljs-attr">indexOf</span>: indexOf,
|
||
<span class="hljs-attr">lastIndexOf</span>: lastIndexOf,
|
||
<span class="hljs-attr">find</span>: find,
|
||
<span class="hljs-attr">detect</span>: find,
|
||
<span class="hljs-attr">findWhere</span>: findWhere,
|
||
<span class="hljs-attr">each</span>: each,
|
||
<span class="hljs-attr">forEach</span>: each,
|
||
<span class="hljs-attr">map</span>: map,
|
||
<span class="hljs-attr">collect</span>: map,
|
||
<span class="hljs-attr">reduce</span>: reduce,
|
||
<span class="hljs-attr">foldl</span>: reduce,
|
||
<span class="hljs-attr">inject</span>: reduce,
|
||
<span class="hljs-attr">reduceRight</span>: reduceRight,
|
||
<span class="hljs-attr">foldr</span>: reduceRight,
|
||
<span class="hljs-attr">filter</span>: filter,
|
||
<span class="hljs-attr">select</span>: filter,
|
||
<span class="hljs-attr">reject</span>: reject,
|
||
<span class="hljs-attr">every</span>: every,
|
||
<span class="hljs-attr">all</span>: every,
|
||
<span class="hljs-attr">some</span>: some,
|
||
<span class="hljs-attr">any</span>: some,
|
||
<span class="hljs-attr">contains</span>: contains,
|
||
<span class="hljs-attr">includes</span>: contains,
|
||
<span class="hljs-attr">include</span>: contains,
|
||
<span class="hljs-attr">invoke</span>: invoke,
|
||
<span class="hljs-attr">pluck</span>: pluck,
|
||
<span class="hljs-attr">where</span>: where,
|
||
<span class="hljs-attr">max</span>: max,
|
||
<span class="hljs-attr">min</span>: min,
|
||
<span class="hljs-attr">shuffle</span>: shuffle,
|
||
<span class="hljs-attr">sample</span>: sample,
|
||
<span class="hljs-attr">sortBy</span>: sortBy,
|
||
<span class="hljs-attr">groupBy</span>: groupBy,
|
||
<span class="hljs-attr">indexBy</span>: indexBy,
|
||
<span class="hljs-attr">countBy</span>: countBy,
|
||
<span class="hljs-attr">partition</span>: partition,
|
||
<span class="hljs-attr">toArray</span>: toArray,
|
||
<span class="hljs-attr">size</span>: size,
|
||
<span class="hljs-attr">pick</span>: pick,
|
||
<span class="hljs-attr">omit</span>: omit,
|
||
<span class="hljs-attr">first</span>: first,
|
||
<span class="hljs-attr">head</span>: first,
|
||
<span class="hljs-attr">take</span>: first,
|
||
<span class="hljs-attr">initial</span>: initial,
|
||
<span class="hljs-attr">last</span>: last,
|
||
<span class="hljs-attr">rest</span>: rest,
|
||
<span class="hljs-attr">tail</span>: rest,
|
||
<span class="hljs-attr">drop</span>: rest,
|
||
<span class="hljs-attr">compact</span>: compact,
|
||
<span class="hljs-attr">flatten</span>: flatten,
|
||
<span class="hljs-attr">without</span>: without,
|
||
<span class="hljs-attr">uniq</span>: uniq,
|
||
<span class="hljs-attr">unique</span>: uniq,
|
||
<span class="hljs-attr">union</span>: union,
|
||
<span class="hljs-attr">intersection</span>: intersection,
|
||
<span class="hljs-attr">difference</span>: difference,
|
||
<span class="hljs-attr">unzip</span>: unzip,
|
||
<span class="hljs-attr">transpose</span>: unzip,
|
||
<span class="hljs-attr">zip</span>: zip,
|
||
<span class="hljs-attr">object</span>: object,
|
||
<span class="hljs-attr">range</span>: range,
|
||
<span class="hljs-attr">chunk</span>: chunk,
|
||
<span class="hljs-attr">mixin</span>: mixin,
|
||
<span class="hljs-string">'default'</span>: _$<span class="hljs-number">1</span>
|
||
};</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-215">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-215">¶</a>
|
||
</div>
|
||
<p>Default Export</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-216">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-216">¶</a>
|
||
</div>
|
||
<p>Add all of the Underscore functions to the wrapper object.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-keyword">var</span> _ = <span class="hljs-title function_">mixin</span>(allExports);</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-217">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-217">¶</a>
|
||
</div>
|
||
<p>Legacy Node.js API.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>_.<span class="hljs-property">_</span> = _;</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-218">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-218">¶</a>
|
||
</div>
|
||
<p>ESM Exports</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>
|
||
<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> _;
|
||
<span class="hljs-keyword">export</span> { <span class="hljs-variable constant_">VERSION</span>, after, every <span class="hljs-keyword">as</span> all, allKeys, some <span class="hljs-keyword">as</span> any, extendOwn <span class="hljs-keyword">as</span> assign, before, bind, bindAll, chain, chunk, clone, map <span class="hljs-keyword">as</span> collect, compact, compose, constant, contains, countBy, create, debounce, defaults, defer, delay, find <span class="hljs-keyword">as</span> detect, difference, rest <span class="hljs-keyword">as</span> drop, each, _escape <span class="hljs-keyword">as</span> <span class="hljs-built_in">escape</span>, every, extend, extendOwn, filter, find, findIndex, findKey, findLastIndex, findWhere, first, flatten, reduce <span class="hljs-keyword">as</span> foldl, reduceRight <span class="hljs-keyword">as</span> foldr, each <span class="hljs-keyword">as</span> forEach, functions, get, groupBy, has, first <span class="hljs-keyword">as</span> head, identity, contains <span class="hljs-keyword">as</span> include, contains <span class="hljs-keyword">as</span> includes, indexBy, indexOf, initial, reduce <span class="hljs-keyword">as</span> inject, intersection, invert, invoke, isArguments$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> isArguments, isArray, isArrayBuffer, isBoolean, isDataView$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> isDataView, isDate, isElement, isEmpty, isEqual, isError, isFinite$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> <span class="hljs-built_in">isFinite</span>, isFunction$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> isFunction, isMap, isMatch, isNaN$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> <span class="hljs-built_in">isNaN</span>, isNull, isNumber, isObject, isRegExp, isSet, isString, isSymbol, isTypedArray$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> isTypedArray, isUndefined, isWeakMap, isWeakSet, iteratee, keys, last, lastIndexOf, map, mapObject, matcher, matcher <span class="hljs-keyword">as</span> matches, max, memoize, functions <span class="hljs-keyword">as</span> methods, min, mixin, negate, noop, now, object, omit, once, pairs, partial, partition, pick, pluck, property, propertyOf, random, range, reduce, reduceRight, reject, rest, restArguments, result, sample, filter <span class="hljs-keyword">as</span> select, shuffle, size, some, sortBy, sortedIndex, rest <span class="hljs-keyword">as</span> tail, first <span class="hljs-keyword">as</span> take, tap, template, templateSettings, throttle, times, toArray, toPath$<span class="hljs-number">1</span> <span class="hljs-keyword">as</span> toPath, unzip <span class="hljs-keyword">as</span> transpose, _unescape <span class="hljs-keyword">as</span> <span class="hljs-built_in">unescape</span>, union, uniq, uniq <span class="hljs-keyword">as</span> unique, uniqueId, unzip, values, where, without, wrap, zip };</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-219">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-219">¶</a>
|
||
</div>
|
||
<h1 id="sourcemappingurlunderscore-esmjsmap">sourceMappingURL=underscore-esm.js.map</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|