/documentation/docs/underscore.html
HTML | 1892 lines | 1259 code | 633 blank | 0 comment | 0 complexity | b6c7530433edfb454865be08d4e16b4f MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- <!DOCTYPE html>
- <html>
- <head>
- <title>underscore.coffee</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.coffee</h1>
- </div>
- </li>
-
-
-
- <li id="section-1">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-1">¶</a>
- </div>
- <p><strong>Underscore.coffee
- (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.</strong>
- Underscore is freely distributable under the terms of the
- <a href="http://en.wikipedia.org/wiki/MIT_License">MIT license</a>.
- Portions of Underscore are inspired by or borrowed from
- <a href="http://prototypejs.org/api">Prototype.js</a>, Oliver Steele's
- <a href="http://osteele.com">Functional</a>, and John Resig's
- <a href="http://ejohn.org">Micro-Templating</a>.
- For all details and documentation:
- <a href="http://documentcloud.github.com/underscore/">http://documentcloud.github.com/underscore/</a></p>
- <h2>Baseline setup</h2>
- </div>
-
- </li>
-
-
- <li id="section-2">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-2">¶</a>
- </div>
- <p>Establish the root object, <code>window</code> in the browser, or <code>global</code> on the server.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>root = <span class="keyword">this</span></pre></div></div>
-
- </li>
-
-
- <li id="section-3">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-3">¶</a>
- </div>
- <p>Save the previous value of the <code>_</code> variable.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>previousUnderscore = root._</pre></div></div>
-
- </li>
-
-
- <li id="section-4">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-4">¶</a>
- </div>
- <p>Establish the object that gets thrown to break out of a loop iteration.
- <code>StopIteration</code> is SOP on Mozilla.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>breaker = <span class="keyword">if</span> <span class="keyword">typeof</span>(StopIteration) <span class="keyword">is</span> <span class="string">'undefined'</span> <span class="keyword">then</span> <span class="string">'__break__'</span> <span class="keyword">else</span> StopIteration</pre></div></div>
-
- </li>
-
-
- <li id="section-5">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-5">¶</a>
- </div>
- <p>Helper function to escape <strong>RegExp</strong> contents, because JS doesn't have one.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="function"><span class="title">escapeRegExp</span></span> = (string) -> string.replace(<span class="regexp">/([.*+?^${}()|[\]\/\\])/g</span>, <span class="string">'\\$1'</span>)</pre></div></div>
-
- </li>
-
-
- <li id="section-6">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-6">¶</a>
- </div>
- <p>Save bytes in the minified (but not gzipped) version:</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>ArrayProto = Array.prototype
- ObjProto = Object.prototype</pre></div></div>
-
- </li>
-
-
- <li id="section-7">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-7">¶</a>
- </div>
- <p>Create quick reference variables for speed access to core prototypes.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>slice = ArrayProto.slice
- unshift = ArrayProto.unshift
- toString = ObjProto.toString
- hasOwnProperty = ObjProto.hasOwnProperty
- propertyIsEnumerable = ObjProto.propertyIsEnumerable</pre></div></div>
-
- </li>
-
-
- <li id="section-8">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-8">¶</a>
- </div>
- <p>All <strong>ECMA5</strong> native implementations we hope to use are declared here.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>nativeForEach = ArrayProto.forEach
- nativeMap = ArrayProto.map
- nativeReduce = ArrayProto.reduce
- nativeReduceRight = ArrayProto.reduceRight
- nativeFilter = ArrayProto.filter
- nativeEvery = ArrayProto.every
- nativeSome = ArrayProto.some
- nativeIndexOf = ArrayProto.indexOf
- nativeLastIndexOf = ArrayProto.lastIndexOf
- nativeIsArray = Array.isArray
- nativeKeys = Object.keys</pre></div></div>
-
- </li>
-
-
- <li id="section-9">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-9">¶</a>
- </div>
- <p>Create a safe reference to the Underscore object for use below.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="function"><span class="title">_</span></span> = (obj) -> <span class="keyword">new</span> wrapper(obj)</pre></div></div>
-
- </li>
-
-
- <li id="section-10">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-10">¶</a>
- </div>
- <p>Export the Underscore object for <strong>CommonJS</strong>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre><span class="keyword">if</span> <span class="keyword">typeof</span>(exports) != <span class="string">'undefined'</span> <span class="keyword">then</span> exports._ = _</pre></div></div>
-
- </li>
-
-
- <li id="section-11">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-11">¶</a>
- </div>
- <p>Export Underscore to global scope.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>root._ = _</pre></div></div>
-
- </li>
-
-
- <li id="section-12">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-12">¶</a>
- </div>
- <p>Current version.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.VERSION = <span class="string">'1.1.0'</span></pre></div></div>
-
- </li>
-
-
- <li id="section-13">
- <div class="annotation">
-
- <div class="pilwrap for-h2">
- <a class="pilcrow" href="#section-13">¶</a>
- </div>
- <h2>Collection Functions</h2>
- </div>
-
- </li>
-
-
- <li id="section-14">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-14">¶</a>
- </div>
- <p>The cornerstone, an <strong>each</strong> implementation.
- Handles objects implementing <strong>forEach</strong>, arrays, and raw objects.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">each</span></span> = (obj, iterator, context) ->
- <span class="keyword">try</span>
- <span class="keyword">if</span> nativeForEach <span class="keyword">and</span> obj.forEach <span class="keyword">is</span> nativeForEach
- obj.forEach iterator, context
- <span class="keyword">else</span> <span class="keyword">if</span> _.isNumber obj.length
- iterator.call context, obj[i], i, obj <span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">0.</span>..obj.length]
- <span class="keyword">else</span>
- iterator.call context, val, key, obj <span class="keyword">for</span> own key, val <span class="keyword">of</span> obj
- <span class="keyword">catch</span> e
- <span class="keyword">throw</span> e <span class="keyword">if</span> e <span class="keyword">isnt</span> breaker
- obj</pre></div></div>
-
- </li>
-
-
- <li id="section-15">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-15">¶</a>
- </div>
- <p>Return the results of applying the iterator to each element. Use JavaScript
- 1.6's version of <strong>map</strong>, if possible.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">map</span></span> = (obj, iterator, context) ->
- <span class="keyword">return</span> obj.map(iterator, context) <span class="keyword">if</span> nativeMap <span class="keyword">and</span> obj.map <span class="keyword">is</span> nativeMap
- results = []
- _.each obj, (value, index, list) ->
- results.push iterator.call context, value, index, list
- results</pre></div></div>
-
- </li>
-
-
- <li id="section-16">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-16">¶</a>
- </div>
- <p><strong>Reduce</strong> builds up a single result from a list of values. Also known as
- <strong>inject</strong>, or <strong>foldl</strong>. Uses JavaScript 1.8's version of <strong>reduce</strong>, if possible.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reduce</span></span> = (obj, iterator, memo, context) ->
- <span class="keyword">if</span> nativeReduce <span class="keyword">and</span> obj.reduce <span class="keyword">is</span> nativeReduce
- iterator = _.bind iterator, context <span class="keyword">if</span> context
- <span class="keyword">return</span> obj.reduce iterator, memo
- _.each obj, (value, index, list) ->
- memo = iterator.call context, memo, value, index, list
- memo</pre></div></div>
-
- </li>
-
-
- <li id="section-17">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-17">¶</a>
- </div>
- <p>The right-associative version of <strong>reduce</strong>, also known as <strong>foldr</strong>. Uses
- JavaScript 1.8's version of <strong>reduceRight</strong>, if available.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reduceRight</span></span> = (obj, iterator, memo, context) ->
- <span class="keyword">if</span> nativeReduceRight <span class="keyword">and</span> obj.reduceRight <span class="keyword">is</span> nativeReduceRight
- iterator = _.bind iterator, context <span class="keyword">if</span> context
- <span class="keyword">return</span> obj.reduceRight iterator, memo
- reversed = _.clone(_.toArray(obj)).reverse()
- _.reduce reversed, iterator, memo, context</pre></div></div>
-
- </li>
-
-
- <li id="section-18">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-18">¶</a>
- </div>
- <p>Return the first value which passes a truth test.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">detect</span></span> = (obj, iterator, context) ->
- result = <span class="literal">null</span>
- _.each obj, (value, index, list) ->
- <span class="keyword">if</span> iterator.call context, value, index, list
- result = value
- _.breakLoop()
- result</pre></div></div>
-
- </li>
-
-
- <li id="section-19">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-19">¶</a>
- </div>
- <p>Return all the elements that pass a truth test. Use JavaScript 1.6's
- <strong>filter</strong>, if it exists.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">filter</span></span> = (obj, iterator, context) ->
- <span class="keyword">return</span> obj.filter iterator, context <span class="keyword">if</span> nativeFilter <span class="keyword">and</span> obj.filter <span class="keyword">is</span> nativeFilter
- results = []
- _.each obj, (value, index, list) ->
- results.push value <span class="keyword">if</span> iterator.call context, value, index, list
- results</pre></div></div>
-
- </li>
-
-
- <li id="section-20">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-20">¶</a>
- </div>
- <p>Return all the elements for which a truth test fails.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">reject</span></span> = (obj, iterator, context) ->
- results = []
- _.each obj, (value, index, list) ->
- results.push value <span class="keyword">if</span> <span class="keyword">not</span> iterator.call context, value, index, list
- results</pre></div></div>
-
- </li>
-
-
- <li id="section-21">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-21">¶</a>
- </div>
- <p>Determine whether all of the elements match a truth test. Delegate to
- JavaScript 1.6's <strong>every</strong>, if it is present.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">every</span></span> = (obj, iterator, context) ->
- iterator ||= _.identity
- <span class="keyword">return</span> obj.every iterator, context <span class="keyword">if</span> nativeEvery <span class="keyword">and</span> obj.every <span class="keyword">is</span> nativeEvery
- result = <span class="literal">true</span>
- _.each obj, (value, index, list) ->
- _.breakLoop() <span class="keyword">unless</span> (result = result <span class="keyword">and</span> iterator.call(context, value, index, list))
- result</pre></div></div>
-
- </li>
-
-
- <li id="section-22">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-22">¶</a>
- </div>
- <p>Determine if at least one element in the object matches a truth test. Use
- JavaScript 1.6's <strong>some</strong>, if it exists.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">some</span></span> = (obj, iterator, context) ->
- iterator ||= _.identity
- <span class="keyword">return</span> obj.some iterator, context <span class="keyword">if</span> nativeSome <span class="keyword">and</span> obj.some <span class="keyword">is</span> nativeSome
- result = <span class="literal">false</span>
- _.each obj, (value, index, list) ->
- _.breakLoop() <span class="keyword">if</span> (result = iterator.call(context, value, index, list))
- result</pre></div></div>
-
- </li>
-
-
- <li id="section-23">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-23">¶</a>
- </div>
- <p>Determine if a given value is included in the array or object,
- based on <code>===</code>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">include</span></span> = (obj, target) ->
- <span class="keyword">return</span> _.indexOf(obj, target) <span class="keyword">isnt</span> -<span class="number">1</span> <span class="keyword">if</span> nativeIndexOf <span class="keyword">and</span> obj.indexOf <span class="keyword">is</span> nativeIndexOf
- <span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">for</span> own key, val <span class="keyword">of</span> obj <span class="keyword">when</span> val <span class="keyword">is</span> target
- <span class="literal">false</span></pre></div></div>
-
- </li>
-
-
- <li id="section-24">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-24">¶</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="function"><span class="title">invoke</span></span> = (obj, method) ->
- args = _.rest arguments, <span class="number">2</span>
- (<span class="keyword">if</span> method <span class="keyword">then</span> val[method] <span class="keyword">else</span> val).apply(val, args) <span class="keyword">for</span> val <span class="keyword">in</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>Convenience version of a common use case of <strong>map</strong>: fetching a property.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">pluck</span></span> = (obj, key) ->
- _.map(obj, (val) -> val[key])</pre></div></div>
-
- </li>
-
-
- <li id="section-26">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-26">¶</a>
- </div>
- <p>Return the maximum item or (item-based computation).</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">max</span></span> = (obj, iterator, context) ->
- <span class="keyword">return</span> Math.max.apply(Math, obj) <span class="keyword">if</span> <span class="keyword">not</span> iterator <span class="keyword">and</span> _.isArray(obj)
- result = computed: -Infinity
- _.each obj, (value, index, list) ->
- computed = <span class="keyword">if</span> iterator <span class="keyword">then</span> iterator.call(context, value, index, list) <span class="keyword">else</span> value
- computed >= result.computed <span class="keyword">and</span> (result = {value: value, computed: computed})
- result.value</pre></div></div>
-
- </li>
-
-
- <li id="section-27">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-27">¶</a>
- </div>
- <p>Return the minimum element (or element-based computation).</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">min</span></span> = (obj, iterator, context) ->
- <span class="keyword">return</span> Math.min.apply(Math, obj) <span class="keyword">if</span> <span class="keyword">not</span> iterator <span class="keyword">and</span> _.isArray(obj)
- result = computed: Infinity
- _.each obj, (value, index, list) ->
- computed = <span class="keyword">if</span> iterator <span class="keyword">then</span> iterator.call(context, value, index, list) <span class="keyword">else</span> value
- computed < result.computed <span class="keyword">and</span> (result = {value: value, computed: computed})
- result.value</pre></div></div>
-
- </li>
-
-
- <li id="section-28">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-28">¶</a>
- </div>
- <p>Sort the object's values by a criterion produced by an iterator.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">sortBy</span></span> = (obj, iterator, context) ->
- _.pluck(((_.map obj, (value, index, list) ->
- {value: value, criteria: iterator.call(context, value, index, list)}
- ).sort((left, right) ->
- a = left.criteria; b = right.criteria
- <span class="keyword">if</span> a < b <span class="keyword">then</span> -<span class="number">1</span> <span class="keyword">else</span> <span class="keyword">if</span> a > b <span class="keyword">then</span> <span class="number">1</span> <span class="keyword">else</span> <span class="number">0</span>
- )), <span class="string">'value'</span>)</pre></div></div>
-
- </li>
-
-
- <li id="section-29">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-29">¶</a>
- </div>
- <p>Use a comparator function to figure out at what index an object should
- be inserted so as to maintain order. Uses binary search.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">sortedIndex</span></span> = (array, obj, iterator) ->
- iterator ||= _.identity
- low = <span class="number">0</span>
- high = array.length
- <span class="keyword">while</span> low < high
- mid = (low + high) >> <span class="number">1</span>
- <span class="keyword">if</span> iterator(array[mid]) < iterator(obj) <span class="keyword">then</span> low = mid + <span class="number">1</span> <span class="keyword">else</span> high = mid
- low</pre></div></div>
-
- </li>
-
-
- <li id="section-30">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-30">¶</a>
- </div>
- <p>Convert anything iterable into a real, live array.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">toArray</span></span> = (iterable) ->
- <span class="keyword">return</span> [] <span class="keyword">if</span> (!iterable)
- <span class="keyword">return</span> iterable.toArray() <span class="keyword">if</span> (iterable.toArray)
- <span class="keyword">return</span> iterable <span class="keyword">if</span> (_.isArray(iterable))
- <span class="keyword">return</span> slice.call(iterable) <span class="keyword">if</span> (_.isArguments(iterable))
- _.values(iterable)</pre></div></div>
-
- </li>
-
-
- <li id="section-31">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-31">¶</a>
- </div>
- <p>Return the number of elements in an object.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">size</span></span> = (obj) -> _.toArray(obj).length</pre></div></div>
-
- </li>
-
-
- <li id="section-32">
- <div class="annotation">
-
- <div class="pilwrap for-h2">
- <a class="pilcrow" href="#section-32">¶</a>
- </div>
- <h2>Array Functions</h2>
- </div>
-
- </li>
-
-
- <li id="section-33">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-33">¶</a>
- </div>
- <p>Get the first element of an array. Passing <code>n</code> will return the first N
- values in the array. Aliased as <strong>head</strong>. The <code>guard</code> check allows it to work
- with <strong>map</strong>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">first</span></span> = (array, n, guard) ->
- <span class="keyword">if</span> n <span class="keyword">and</span> <span class="keyword">not</span> guard <span class="keyword">then</span> slice.call(array, <span class="number">0</span>, n) <span class="keyword">else</span> array[<span class="number">0</span>]</pre></div></div>
-
- </li>
-
-
- <li id="section-34">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-34">¶</a>
- </div>
- <p>Returns everything but the first entry of the array. Aliased as <strong>tail</strong>.
- Especially useful on the arguments object. Passing an <code>index</code> will return
- the rest of the values in the array from that index onward. The <code>guard</code>
- check allows it to work with <strong>map</strong>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">rest</span></span> = (array, index, guard) ->
- slice.call(array, <span class="keyword">if</span> _.isUndefined(index) <span class="keyword">or</span> guard <span class="keyword">then</span> <span class="number">1</span> <span class="keyword">else</span> index)</pre></div></div>
-
- </li>
-
-
- <li id="section-35">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-35">¶</a>
- </div>
- <p>Get the last element of an array.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">last</span></span> = (array) -> array[array.length - <span class="number">1</span>]</pre></div></div>
-
- </li>
-
-
- <li id="section-36">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-36">¶</a>
- </div>
- <p>Trim out all falsy values from an array.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">compact</span></span> = (array) -> item <span class="keyword">for</span> item <span class="keyword">in</span> array <span class="keyword">when</span> item</pre></div></div>
-
- </li>
-
-
- <li id="section-37">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-37">¶</a>
- </div>
- <p>Return a completely flattened version of an array.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">flatten</span></span> = (array) ->
- _.reduce array, (memo, value) ->
- <span class="keyword">return</span> memo.concat(_.flatten(value)) <span class="keyword">if</span> _.isArray value
- memo.push value
- memo
- , []</pre></div></div>
-
- </li>
-
-
- <li id="section-38">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-38">¶</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="function"><span class="title">without</span></span> = (array) ->
- values = _.rest arguments
- val <span class="keyword">for</span> val <span class="keyword">in</span> _.toArray(array) <span class="keyword">when</span> <span class="keyword">not</span> _.include values, val</pre></div></div>
-
- </li>
-
-
- <li id="section-39">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-39">¶</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.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">uniq</span></span> = (array, isSorted) ->
- memo = []
- <span class="keyword">for</span> el, i <span class="keyword">in</span> _.toArray array
- memo.push el <span class="keyword">if</span> i <span class="keyword">is</span> <span class="number">0</span> || (<span class="keyword">if</span> isSorted <span class="keyword">is</span> <span class="literal">true</span> <span class="keyword">then</span> _.last(memo) <span class="keyword">isnt</span> el <span class="keyword">else</span> <span class="keyword">not</span> _.include(memo, el))
- memo</pre></div></div>
-
- </li>
-
-
- <li id="section-40">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-40">¶</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="function"><span class="title">intersect</span></span> = (array) ->
- rest = _.rest arguments
- _.select _.uniq(array), (item) ->
- _.all rest, (other) ->
- _.indexOf(other, item) >= <span class="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>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="function"><span class="title">zip</span></span> = ->
- length = _.max _.pluck arguments, <span class="string">'length'</span>
- results = <span class="keyword">new</span> Array length
- <span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">0.</span>..length]
- results[i] = _.pluck arguments, String i
- results</pre></div></div>
-
- </li>
-
-
- <li id="section-42">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-42">¶</a>
- </div>
- <p>If the browser doesn't supply us with <strong>indexOf</strong> (I'm looking at you, MSIE),
- we need this function. Return the position of the first 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="function"><span class="title">indexOf</span></span> = (array, item) ->
- <span class="keyword">return</span> array.indexOf item <span class="keyword">if</span> nativeIndexOf <span class="keyword">and</span> array.indexOf <span class="keyword">is</span> nativeIndexOf
- i = <span class="number">0</span>; l = array.length
- <span class="keyword">while</span> l - i
- <span class="keyword">if</span> array[i] <span class="keyword">is</span> item <span class="keyword">then</span> <span class="keyword">return</span> i <span class="keyword">else</span> i++
- -<span class="number">1</span></pre></div></div>
-
- </li>
-
-
- <li id="section-43">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-43">¶</a>
- </div>
- <p>Provide JavaScript 1.6's <strong>lastIndexOf</strong>, delegating to the native function,
- if possible.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">lastIndexOf</span></span> = (array, item) ->
- <span class="keyword">return</span> array.lastIndexOf(item) <span class="keyword">if</span> nativeLastIndexOf <span class="keyword">and</span> array.lastIndexOf <span class="keyword">is</span> nativeLastIndexOf
- i = array.length
- <span class="keyword">while</span> i
- <span class="keyword">if</span> array[i] <span class="keyword">is</span> item <span class="keyword">then</span> <span class="keyword">return</span> i <span class="keyword">else</span> i--
- -<span class="number">1</span></pre></div></div>
-
- </li>
-
-
- <li id="section-44">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-44">¶</a>
- </div>
- <p>Generate an integer Array containing an arithmetic progression. A port of
- <a href="http://docs.python.org/library/functions.html#range">the native Python <strong>range</strong> function</a>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">range</span></span> = (start, stop, step) ->
- a = arguments
- solo = a.length <= <span class="number">1</span>
- i = start = <span class="keyword">if</span> solo <span class="keyword">then</span> <span class="number">0</span> <span class="keyword">else</span> a[<span class="number">0</span>]
- stop = <span class="keyword">if</span> solo <span class="keyword">then</span> a[<span class="number">0</span>] <span class="keyword">else</span> a[<span class="number">1</span>]
- step = a[<span class="number">2</span>] <span class="keyword">or</span> <span class="number">1</span>
- len = Math.ceil((stop - start) / step)
- <span class="keyword">return</span> [] <span class="keyword">if</span> len <= <span class="number">0</span>
- range = <span class="keyword">new</span> Array len
- idx = <span class="number">0</span>
- <span class="keyword">loop</span>
- <span class="keyword">return</span> range <span class="keyword">if</span> (<span class="keyword">if</span> step > <span class="number">0</span> <span class="keyword">then</span> i - stop <span class="keyword">else</span> stop - i) >= <span class="number">0</span>
- range[idx] = i
- idx++
- i+= step</pre></div></div>
-
- </li>
-
-
- <li id="section-45">
- <div class="annotation">
-
- <div class="pilwrap for-h2">
- <a class="pilcrow" href="#section-45">¶</a>
- </div>
- <h2>Function Functions</h2>
- </div>
-
- </li>
-
-
- <li id="section-46">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-46">¶</a>
- </div>
- <p>Create a function bound to a given object (assigning <code>this</code>, and arguments,
- optionally). Binding with arguments is also known as <strong>curry</strong>.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">bind</span></span> = (func, obj) ->
- args = _.rest arguments, <span class="number">2</span>
- -> func.apply obj <span class="keyword">or</span> root, args.concat arguments</pre></div></div>
-
- </li>
-
-
- <li id="section-47">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-47">¶</a>
- </div>
- <p>Bind all of an object's methods to that object. Useful for ensuring that
- all callbacks defined on an object belong to it.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">bindAll</span></span> = (obj) ->
- funcs = <span class="keyword">if</span> arguments.length > <span class="number">1</span> <span class="keyword">then</span> _.rest(arguments) <span class="keyword">else</span> _.functions(obj)
- _.each funcs, (f) -> obj[f] = _.bind obj[f], obj
- obj</pre></div></div>
-
- </li>
-
-
- <li id="section-48">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-48">¶</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="function"><span class="title">delay</span></span> = (func, wait) ->
- args = _.rest arguments, <span class="number">2</span>
- setTimeout((-> func.apply(func, args)), wait)</pre></div></div>
-
- </li>
-
-
- <li id="section-49">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-49">¶</a>
- </div>
- <p>Memoize an expensive function by storing its results.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">memoize</span></span> = (func, hasher) ->
- memo = {}
- hasher <span class="keyword">or</span>= _.identity
- ->
- key = hasher.apply <span class="keyword">this</span>, arguments
- <span class="keyword">return</span> memo[key] <span class="keyword">if</span> key <span class="keyword">of</span> memo
- memo[key] = func.apply <span class="keyword">this</span>, arguments</pre></div></div>
-
- </li>
-
-
- <li id="section-50">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-50">¶</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="function"><span class="title">defer</span></span> = (func) ->
- _.delay.apply _, [func, <span class="number">1</span>].concat _.rest arguments</pre></div></div>
-
- </li>
-
-
- <li id="section-51">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-51">¶</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="function"><span class="title">wrap</span></span> = (func, wrapper) ->
- -> wrapper.apply wrapper, [func].concat arguments</pre></div></div>
-
- </li>
-
-
- <li id="section-52">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-52">¶</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="function"><span class="title">compose</span></span> = ->
- funcs = arguments
- ->
- args = arguments
- <span class="keyword">for</span> i <span class="keyword">in</span> [funcs.length - <span class="number">1.</span><span class="number">.0</span>] <span class="keyword">by</span> -<span class="number">1</span>
- args = [funcs[i].apply(<span class="keyword">this</span>, args)]
- args[<span class="number">0</span>]</pre></div></div>
-
- </li>
-
-
- <li id="section-53">
- <div class="annotation">
-
- <div class="pilwrap for-h2">
- <a class="pilcrow" href="#section-53">¶</a>
- </div>
- <h2>Object Functions</h2>
- </div>
-
- </li>
-
-
- <li id="section-54">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-54">¶</a>
- </div>
- <p>Retrieve the names of an object's properties.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.keys = nativeKeys <span class="keyword">or</span> (obj) ->
- <span class="keyword">return</span> _.range <span class="number">0</span>, obj.length <span class="keyword">if</span> _.isArray(obj)
- key <span class="keyword">for</span> key, val <span class="keyword">of</span> obj</pre></div></div>
-
- </li>
-
-
- <li id="section-55">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-55">¶</a>
- </div>
- <p>Retrieve the values of an object's properties.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">values</span></span> = (obj) ->
- _.map obj, _.identity</pre></div></div>
-
- </li>
-
-
- <li id="section-56">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-56">¶</a>
- </div>
- <p>Return a sorted list of the function names available in Underscore.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">functions</span></span> = (obj) ->
- _.filter(_.keys(obj), (key) -> _.isFunction(obj[key])).sort()</pre></div></div>
-
- </li>
-
-
- <li id="section-57">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-57">¶</a>
- </div>
- <p>Extend a given object with all of the properties in a source object.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">extend</span></span> = (obj) ->
- <span class="keyword">for</span> source <span class="keyword">in</span> _.rest(arguments)
- obj[key] = val <span class="keyword">for</span> key, val <span class="keyword">of</span> source
- obj</pre></div></div>
-
- </li>
-
-
- <li id="section-58">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-58">¶</a>
- </div>
- <p>Create a (shallow-cloned) duplicate of an object.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre>_.<span class="function"><span class="title">clone</span></span> = (obj) ->
- <span class="keyword">return</span> obj.slice <span class="number">0</span> <span class="keyword">if</span> _.isArray obj
- _.extend {}, obj</pre></div></div>
-
- </li>
-
-
- <li id="section-59">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-59">¶</a>
- </div>
- <p>Invokes interceptor with the obj, and then returns obj.
- 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="function"><span class="title">tap</span></span> = (obj, interceptor) ->
- interceptor obj
- obj</pre></div></div>
-
- </li>
-
-
- <li id="section-60">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-60">¶</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="function"><span class="title">isEqual</span></span> = (a, b) -></pre></div></div>
-
- </li>
-
-
- <li id="section-61">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-61">¶</a>
- </div>
- <p>Check object identity.</p>
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">if</span> a <span class="keyword">is</span> b</pre></div></div>
-
- </li>
-
-
- <li id="section-62">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-62">¶</a>
- </div>
- <p>Different types?</p>
- </div>
-
- <div class="content"><div class='highlight'><pre> atype = <span class="keyword">typeof</span>(a); btype = <span class="keyword">typeof</span>(b)
- <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> atype <span class="keyword">isnt</span> btype</pre></div></div>
-
- </li>
-
-
- <li id="section-63">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-63">¶</a>
- </div>
- <p>Basic equality test (watch out for coercions).</p>
- </div>
-
- <div class="content"><div class='highlight'><pre> <span class="keyword">return</span> <span class="literal">true</span> <span class="keyword">if</span> `<span class="javascript">a == b</span>`</pre></div></div>
-
- </li>
-
-
- <li id="section-64">
- <div class="annotation">
-
- <div class="pilwrap ">
- <a class="pilcrow" href="#section-64">¶</a>
- </div>
- <p>One is falsy and the other truthy.</p>
- …
Large files files are truncated, but you can click here to view the full file