From adcc2dd8d26c19f2ec0c2730d69c3fac46449f00 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Thu, 26 Apr 2012 15:46:47 -0400 Subject: [PATCH] lodash: Simplify `_.keys` fallback. [jddalton] Former-commit-id: 15d265f4f16ab2418bb5dcddf68a2fd43ebdf5b2 --- doc/README.md | 170 +++++++++++++++++++++++++------------------------- lodash.js | 7 +-- lodash.min.js | 44 ++++++------- 3 files changed, 109 insertions(+), 112 deletions(-) diff --git a/doc/README.md b/doc/README.md index 8d812336e..093d8df30 100644 --- a/doc/README.md +++ b/doc/README.md @@ -139,7 +139,7 @@ The `lodash` function. -### `_.VERSION` +### `_.VERSION` *(String)*: The semantic version number. [▲][1] @@ -148,7 +148,7 @@ The `lodash` function. -### `_.after(times, func)` +### `_.after(times, func)` Creates a new function that is restricted to executing only after it is called a given number of `times`. [▲][1] @@ -173,7 +173,7 @@ _.forEach(notes, function(note) { -### `_.bind(func [, arg1, arg2, ...])` +### `_.bind(func [, arg1, arg2, ...])` Creates a new function that, when called, invokes `func` with the `this` binding of `thisArg` and prepends additional arguments to those passed to the bound function. [▲][1] @@ -197,7 +197,7 @@ func(); -### `_.bindAll(object [, methodName1, methodName2, ...])` +### `_.bindAll(object [, methodName1, methodName2, ...])` Binds methods on the `object` to the object, overwriting the non-bound method. If no method names are provided, all the function properties of the `object` will be bound. [▲][1] @@ -226,7 +226,7 @@ jQuery('#lodash_button').on('click', buttonView.onClick); -### `_.chain()` +### `_.chain()` Extracts the value from a wrapped chainable object. [▲][1] @@ -244,7 +244,7 @@ _([1, 2, 3]).value(); -### `_.chain(value)` +### `_.chain(value)` Wraps the value in a `lodash` chainable object. [▲][1] @@ -275,7 +275,7 @@ var youngest = _.chain(stooges) -### `_.clone(value)` +### `_.clone(value)` Create a shallow clone of the `value`. Any nested objects or arrays will be assigned by reference and not cloned. [▲][1] @@ -296,7 +296,7 @@ _.clone({ 'name': 'moe' }); -### `_.compact(array)` +### `_.compact(array)` Produces a new array with all falsey values of `array` removed. The values `false`, `null`, `0`, `""`, `undefined` and `NaN` are all falsey. [▲][1] @@ -317,7 +317,7 @@ _.compact([0, 1, false, 2, '', 3]); -### `_.compose([func1, func2, ...])` +### `_.compose([func1, func2, ...])` Creates a new function that is the composition of the passed functions, where each function consumes the return value of the function that follows. In math terms, composing thefunctions `f()`, `g()`, and `h()` produces `f(g(h()))`. [▲][1] @@ -341,7 +341,7 @@ welcome('moe'); -### `_.contains(collection, target)` +### `_.contains(collection, target)` Checks if a given `target` value is present in a `collection` using strict equality for comparisons, i.e. `===`. [▲][1] @@ -363,7 +363,7 @@ _.contains([1, 2, 3], 3); -### `_.debounce(func, wait, immediate)` +### `_.debounce(func, wait, immediate)` Creates a new function that will postpone its execution until after `wait` milliseconds have elapsed since the last time it was invoked. Pass `true` for `immediate` to cause debounce to invoke the function on the leading, instead of the trailing, edge of the `wait` timeout. [▲][1] @@ -386,7 +386,7 @@ jQuery(window).on('resize', lazyLayout); -### `_.defaults(object [, defaults1, defaults2, ..])` +### `_.defaults(object [, defaults1, defaults2, ..])` Assigns missing properties in `object` with default values from the defaults objects. As soon as a property is set, additional defaults of the same property will be ignored. [▲][1] @@ -409,7 +409,7 @@ _.defaults(iceCream, { 'flavor': 'vanilla', 'sprinkles': 'lots' }); -### `_.defer(func [, arg1, arg2, ...])` +### `_.defer(func [, arg1, arg2, ...])` Defers invoking the `func` function until the current call stack has cleared. Additional arguments are passed to `func` when it is invoked. [▲][1] @@ -431,7 +431,7 @@ _.defer(function() { alert('deferred'); }); -### `_.delay(func, wait [, arg1, arg2, ...])` +### `_.delay(func, wait [, arg1, arg2, ...])` Invokes the `func` function after `wait` milliseconds. Additional arguments are passed `func` when it is invoked. [▲][1] @@ -455,7 +455,7 @@ _.delay(log, 1000, 'logged later'); -### `_.difference(array [, array1, array2, ...])` +### `_.difference(array [, array1, array2, ...])` Produces a new array of `array` values not present in the other arrays using strict equality for comparisons, i.e. `===`. [▲][1] @@ -477,7 +477,7 @@ _.difference([1, 2, 3, 4, 5], [5, 2, 10]); -### `_.escape(string)` +### `_.escape(string)` Escapes a string for insertion into HTML, replacing `&`, `<`, `>`, `"`, `'`, and `/` characters. [▲][1] @@ -498,7 +498,7 @@ _.escape('Curly, Larry & Moe'); -### `_.every(collection, callback [, thisArg])` +### `_.every(collection, callback [, thisArg])` Checks if the `callback` returns truthy for **all** values of a `collection`. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -521,7 +521,7 @@ _.every([true, 1, null, 'yes'], Boolean); -### `_.extend(object [, source1, source2, ..])` +### `_.extend(object [, source1, source2, ..])` Copies enumerable properties from the source objects to the `destination` object. Subsequent sources will overwrite propery assignments of previous sources. [▲][1] @@ -543,7 +543,7 @@ _.extend({ 'name': 'moe' }, { 'age': 40 }); -### `_.filter(collection, callback [, thisArg])` +### `_.filter(collection, callback [, thisArg])` Examines each value in a `collection`, returning an array of all values the `callback` returns truthy for. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -566,7 +566,7 @@ var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }) -### `_.find(collection, callback [, thisArg])` +### `_.find(collection, callback [, thisArg])` Examines each value in a `collection`, returning the first one the `callback` returns truthy for. The function returns as soon as it finds an acceptable value, and does not iterate over the entire `collection`. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -589,7 +589,7 @@ var even = _.find([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); -### `_.first(array [, n, guard])` +### `_.first(array [, n, guard])` Gets the first value of the `array`. Pass `n` to return the first `n` values of the `array`. [▲][1] @@ -612,7 +612,7 @@ _.first([5, 4, 3, 2, 1]); -### `_.flatten(array, shallow)` +### `_.flatten(array, shallow)` Flattens a nested array *(the nesting can be to any depth)*. If `shallow` is truthy, `array` will only be flattened a single level. [▲][1] @@ -637,7 +637,7 @@ _.flatten([1, [2], [3, [[4]]]], true); -### `_.forEach(collection, callback [, thisArg])` +### `_.forEach(collection, callback [, thisArg])` Iterates over a `collection`, executing the `callback` for each value in the `collection`. The `callback` is bound to the `thisArg` value, if one is passed. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -663,7 +663,7 @@ _.forEach({ 'one': 1, 'two': 2, 'three': 3}, function(num) { alert(num); }); -### `_.functions(object)` +### `_.functions(object)` Produces a sorted array of the properties, own and inherited, of `object` that have function values. [▲][1] @@ -684,7 +684,7 @@ _.functions(_); -### `_.groupBy(collection, callback [, thisArg])` +### `_.groupBy(collection, callback [, thisArg])` Splits a `collection` into sets, grouped by the result of running each value through `callback`. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. The `callback` argument may also be the name of a property to group by. [▲][1] @@ -710,7 +710,7 @@ _.groupBy(['one', 'two', 'three'], 'length'); -### `_.has(object, property)` +### `_.has(object, property)` Checks if the specified object `property` exists and is a direct property, instead of an inherited property. [▲][1] @@ -732,7 +732,7 @@ _.has({ 'a': 1, 'b': 2, 'c': 3 }, 'b'); -### `_.identity(value)` +### `_.identity(value)` This function simply returns the first argument passed to it. Note: It is used throughout Lo-Dash as a default callback. [▲][1] @@ -754,7 +754,7 @@ moe === _.identity(moe); -### `_.indexOf(array, value [, isSorted=false])` +### `_.indexOf(array, value [, isSorted=false])` Gets the index at which the first occurrence of `value` is found using strict equality for comparisons, i.e. `===`. If the `array` is already sorted, passing `true` for `isSorted` will run a faster binary search. [▲][1] @@ -777,7 +777,7 @@ _.indexOf([1, 2, 3], 2); -### `_.initial(array [, n, guard])` +### `_.initial(array [, n, guard])` Gets all but the last value of the `array`. Pass `n` to exclude the last `n` values from the result. [▲][1] @@ -800,7 +800,7 @@ _.initial([5, 4, 3, 2, 1]); -### `_.intersection([array1, array2, ...])` +### `_.intersection([array1, array2, ...])` Computes the intersection of all the passed-in arrays. [▲][1] @@ -821,7 +821,7 @@ _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]); -### `_.invoke(array, methodName [, arg1, arg2, ...])` +### `_.invoke(array, methodName [, arg1, arg2, ...])` Calls the method named by `methodName` for each value of the `collection`. Additional arguments will be passed to each invoked method. [▲][1] @@ -844,7 +844,7 @@ _.invoke([[5, 1, 7], [3, 2, 1]], 'sort'); -### `_.isArguments(value)` +### `_.isArguments(value)` Checks if a `value` is an `arguments` object. [▲][1] @@ -892,7 +892,7 @@ _.isArray([1, 2, 3]); -### `_.isBoolean(value)` +### `_.isBoolean(value)` Checks if a `value` is a boolean *(`true` or `false`)* value. [▲][1] @@ -913,7 +913,7 @@ _.isBoolean(null); -### `_.isDate(value)` +### `_.isDate(value)` Checks if a `value` is a date. [▲][1] @@ -934,7 +934,7 @@ _.isDate(new Date); -### `_.isElement(value)` +### `_.isElement(value)` Checks if a `value` is a DOM element. [▲][1] @@ -979,7 +979,7 @@ _.isEmpty({}); -### `_.isEqual(a, b [, stack])` +### `_.isEqual(a, b [, stack])` Performs a deep comparison between two values to determine if they are equivalent to each other. [▲][1] @@ -1008,7 +1008,7 @@ _.isEqual(moe, clone); -### `_.isFinite(value)` +### `_.isFinite(value)` Checks if a `value` is a finite number. [▲][1] @@ -1035,7 +1035,7 @@ _.isFinite(Infinity); -### `_.isFunction(value)` +### `_.isFunction(value)` Checks if a `value` is a function. [▲][1] @@ -1056,7 +1056,7 @@ _.isFunction(''.concat); -### `_.isNaN(value)` +### `_.isNaN(value)` Checks if a `value` is `NaN`. Note: this is not the same as native `isNaN`, which will return true for `undefined` and other values. See http://es5.github.com/#x15.1.2.4. [▲][1] @@ -1086,7 +1086,7 @@ _.isNaN(undefined); -### `_.isNull(value)` +### `_.isNull(value)` Checks if a `value` is `null`. [▲][1] @@ -1110,7 +1110,7 @@ _.isNull(undefined); -### `_.isNumber(value)` +### `_.isNumber(value)` Checks if a `value` is a number. [▲][1] @@ -1131,7 +1131,7 @@ _.isNumber(8.4 * 5; -### `_.isObject(value)` +### `_.isObject(value)` Checks if a `value` is an object. [▲][1] @@ -1155,7 +1155,7 @@ _.isObject(1); -### `_.isRegExp(value)` +### `_.isRegExp(value)` Checks if a `value` is a regular expression. [▲][1] @@ -1176,7 +1176,7 @@ _.isRegExp(/moe/); -### `_.isString(value)` +### `_.isString(value)` Checks if a `value` is a string. [▲][1] @@ -1197,7 +1197,7 @@ _.isString('moe'); -### `_.isUndefined(value)` +### `_.isUndefined(value)` Checks if a `value` is `undefined`. [▲][1] @@ -1218,7 +1218,7 @@ _.isUndefined(void 0); -### `_.keys(object)` +### `_.keys(object)` Produces an array of the `object`'s enumerable own property names. [▲][1] @@ -1239,7 +1239,7 @@ _.keys({ 'one': 1, 'two': 2, 'three': 3 }); -### `_.last(array [, n, guard])` +### `_.last(array [, n, guard])` Gets the last value of the `array`. Pass `n` to return the lasy `n` values of the `array`. [▲][1] @@ -1262,7 +1262,7 @@ _.last([5, 4, 3, 2, 1]); -### `_.lastIndexOf(array, value)` +### `_.lastIndexOf(array, value)` Gets the index at which the last occurrence of `value` is found using strict equality for comparisons, i.e. `===`. [▲][1] @@ -1284,7 +1284,7 @@ _.lastIndexOf([1, 2, 3, 1, 2, 3], 2); -### `_.map(collection, callback [, thisArg])` +### `_.map(collection, callback [, thisArg])` Produces a new array of values by mapping each value in the `collection` through a transformation `callback`. The `callback` is bound to the `thisArg` value, if one is passed. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -1310,7 +1310,7 @@ _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; }); -### `_.max(collection [, callback, thisArg])` +### `_.max(collection [, callback, thisArg])` Retrieves the maximum value of a `collection`. If `callback` is passed, it will be executed for each value in the `collection` to generate the criterion by which the value is ranked. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -1339,7 +1339,7 @@ _.max(stooges, function(stooge) { return stooge.age; }); -### `_.memoize(func [, resolver])` +### `_.memoize(func [, resolver])` Creates a new function that memoizes the result of `func`. If `resolver` is passed, it will be used to determine the cache key for storing the result based on the arguments passed to the memoized function. By default, the first argument passed to the memoized function is used as the cache key. [▲][1] @@ -1362,7 +1362,7 @@ var fibonacci = _.memoize(function(n) { -### `_.min(collection [, callback, thisArg])` +### `_.min(collection [, callback, thisArg])` Retrieves the minimum value of a `collection`. If `callback` is passed, it will be executed for each value in the `collection` to generate the criterion by which the value is ranked. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -1385,7 +1385,7 @@ _.min([10, 5, 100, 2, 1000]); -### `_.mixin(object)` +### `_.mixin(object)` Adds functions properties of `object` to the `lodash` function and chainable wrapper. [▲][1] @@ -1412,7 +1412,7 @@ _('larry').capitalize(); -### `_.noConflict()` +### `_.noConflict()` Reverts the '_' variable to its previous value and returns a reference to the `lodash` function. [▲][1] @@ -1429,7 +1429,7 @@ var lodash = _.noConflict(); -### `_.once(func)` +### `_.once(func)` Creates a new function that is restricted to one execution. Repeat calls to the function will return the value of the first call. [▲][1] @@ -1452,7 +1452,7 @@ initialize(); -### `_.pick(object [, prop1, prop2, ..])` +### `_.pick(object [, prop1, prop2, ..])` Creates an object composed of the specified properties. Property names may be specified as individual arguments or as arrays of property names. [▲][1] @@ -1474,7 +1474,7 @@ _.pick({ 'name': 'moe', 'age': 40, 'userid': 'moe1' }, 'name', 'age'); -### `_.pluck(collection, property)` +### `_.pluck(collection, property)` Retrieves the value of a specified property from all values in a `collection`. [▲][1] @@ -1502,7 +1502,7 @@ _.pluck(stooges, 'name'); -### `_.range([start=0], end [, step=1])` +### `_.range([start=0], end [, step=1])` Creates an array of numbers *(positive and/or negative)* progressing from `start` up to but not including `stop`. This method is a port of Python's `range()` function. See http://docs.python.org/library/functions.html#range. [▲][1] @@ -1537,7 +1537,7 @@ _.range(0); -### `_.reduce(collection, callback [, accumulator, thisArg])` +### `_.reduce(collection, callback [, accumulator, thisArg])` Boils down a `collection` to a single value. The initial state of the reduction is `accumulator` and each successive step of it should be returned by the `callback`. The `callback` is bound to the `thisArg` value, if one is passed. The `callback` is invoked with `4` arguments; for arrays they are *(accumulator, value, index, array)* and for objects they are *(accumulator, value, key, object)*. [▲][1] @@ -1561,7 +1561,7 @@ var sum = _.reduce([1, 2, 3], function(memo, num) { return memo + num; }); -### `_.reduceRight(collection, callback [, accumulator, thisArg])` +### `_.reduceRight(collection, callback [, accumulator, thisArg])` The right-associative version of `_.reduce`. The `callback` is bound to the `thisArg` value, if one is passed. The `callback` is invoked with `4` arguments; for arrays they are *(accumulator, value, index, array)* and for objects they are *(accumulator, value, key, object)*. [▲][1] @@ -1586,7 +1586,7 @@ var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []); -### `_.reject(collection, callback [, thisArg])` +### `_.reject(collection, callback [, thisArg])` The opposite of `_.filter`, this method returns the values of a `collection` that `callback` does **not** return truthy for. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -1609,7 +1609,7 @@ var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; }); -### `_.rest(array [, n, guard])` +### `_.rest(array [, n, guard])` The opposite of `_.initial`, this method gets all but the first value of the `array`. Pass `n` to exclude the first `n` values from the result. [▲][1] @@ -1632,7 +1632,7 @@ _.rest([5, 4, 3, 2, 1]); -### `_.result(object, property)` +### `_.result(object, property)` Resolves the value of `property` on `object`. If the property is a function it will be invoked and its result returned, else the property value is returned. [▲][1] @@ -1664,7 +1664,7 @@ _.result(object, 'stuff'); -### `_.shuffle(collection)` +### `_.shuffle(collection)` Produces a new array of shuffled `collection` values, using a version of the Fisher-Yates shuffle. See http://en.wikipedia.org/wiki/Fisher-Yates_shuffle. [▲][1] @@ -1685,7 +1685,7 @@ _.shuffle([1, 2, 3, 4, 5, 6]); -### `_.size(collection)` +### `_.size(collection)` Gets the number of values in the `collection`. [▲][1] @@ -1706,7 +1706,7 @@ _.size({ 'one': 1, 'two': 2, 'three': 3 }); -### `_.some(collection, callback [, thisArg])` +### `_.some(collection, callback [, thisArg])` Checks if the `callback` returns truthy for **any** value of a `collection`. The function returns as soon as it finds passing value, and does not iterate over the entire `collection`. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. [▲][1] @@ -1729,7 +1729,7 @@ _.some([null, 0, 'yes', false]); -### `_.sortBy(collection, callback [, thisArg])` +### `_.sortBy(collection, callback [, thisArg])` Produces a new sorted array, ranked in ascending order by the results of running each value of a `collection` through `callback`. The `callback` is invoked with `3` arguments; for arrays they are *(value, index, array)* and for objects they are *(value, key, object)*. The `callback` argument may also be the name of a property to sort by *(e.g. 'length')*. [▲][1] @@ -1752,7 +1752,7 @@ _.sortBy([1, 2, 3, 4, 5, 6], function(num) { return Math.sin(num); }); -### `_.sortedIndex(array, value [, callback])` +### `_.sortedIndex(array, value [, callback])` Uses a binary search to determine the smallest index at which the `value` should be inserted into the `collection` in order to maintain the sort order of the `collection`. If `callback` is passed, it will be executed for each value in the `collection` to compute their sort ranking. The `callback` is invoked with `1` argument. [▲][1] @@ -1775,7 +1775,7 @@ _.sortedIndex([10, 20, 30, 40, 50], 35); -### `_.tap(value, interceptor)` +### `_.tap(value, interceptor)` Invokes `interceptor` with the `value` as the first argument, and then returns `value`. The primary purpose of this method is to "tap into" a method chain, in order to performoperations on intermediate results within the chain. [▲][1] @@ -1802,7 +1802,7 @@ _.chain([1,2,3,200]) -### `_.template(text, data, options)` +### `_.template(text, data, options)` A JavaScript micro-templating method, similar to John Resig's implementation. Lo-Dash templating handles arbitrary delimiters, preserves whitespace, and correctly escapes quotes within interpolated code. [▲][1] @@ -1859,7 +1859,7 @@ _.template('<%= data.hasWith %>', { 'hasWith': 'no' }, { 'variable': 'data' }); -### `_.throttle(func, wait)` +### `_.throttle(func, wait)` Creates a new function that, when invoked, will only call the original function at most once per every `wait` milliseconds. [▲][1] @@ -1881,7 +1881,7 @@ jQuery(window).on('scroll', throttled); -### `_.times(n, callback [, thisArg])` +### `_.times(n, callback [, thisArg])` Executes the `callback` function `n` times. [▲][1] @@ -1900,7 +1900,7 @@ _.times(3, function() { genie.grantWish(); }); -### `_.toArray(collection)` +### `_.toArray(collection)` Converts the `collection`, into an array. Useful for converting the `arguments` object. [▲][1] @@ -1921,7 +1921,7 @@ Converts the `collection`, into an array. Useful for converting the `arguments` -### `_.union([array1, array2, ...])` +### `_.union([array1, array2, ...])` Computes the union of the passed-in arrays. [▲][1] @@ -1942,7 +1942,7 @@ _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]); -### `_.uniq(array [, isSorted=false, callback])` +### `_.uniq(array [, isSorted=false, callback])` Produces a duplicate-value-free version of the `array` using strict equality for comparisons, i.e. `===`. If the `array` is already sorted, passing `true` for `isSorted` will run a faster algorithm. If `callback` is passed, each value of `array` is passed through a transformation `callback` before uniqueness is computed. The `callback` is invoked with `3` arguments; *(value, index, array)*. [▲][1] @@ -1965,7 +1965,7 @@ _.uniq([1, 2, 1, 3, 1, 4]); -### `_.uniqueId([prefix])` +### `_.uniqueId([prefix])` Generates a unique id. If `prefix` is passed, the id will be appended to it. [▲][1] @@ -1986,7 +1986,7 @@ _.uniqueId('contact_'); -### `_.value()` +### `_.value()` Extracts the value from a wrapped chainable object. [▲][1] @@ -2004,7 +2004,7 @@ _([1, 2, 3]).value(); -### `_.values(collection)` +### `_.values(collection)` Produces an array of enumerable own property values of the `collection`. [▲][1] @@ -2025,7 +2025,7 @@ _.values({ 'one': 1, 'two': 2, 'three': 3 }); -### `_.without(array [, value1, value2, ...])` +### `_.without(array [, value1, value2, ...])` Produces a new array with all occurrences of the values removed using strict equality for comparisons, i.e. `===`. [▲][1] @@ -2047,7 +2047,7 @@ _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); -### `_.wrap(func, wrapper [, arg1, arg2, ...])` +### `_.wrap(func, wrapper [, arg1, arg2, ...])` Create a new function that passes the `func` function to the `wrapper` function as its first argument. Additional arguments are appended to those passed to the `wrapper` function. [▲][1] @@ -2074,7 +2074,7 @@ hello(); -### `_.zip([array1, array2, ...])` +### `_.zip([array1, array2, ...])` Merges together the values of each of the arrays with the value at the corresponding position. Useful for separate data sources that are coordinated through matching array indexes. For a matrix of nested arrays, `_.zip.apply(...)` can transpose the matrix in a similar fashion. [▲][1] @@ -2102,7 +2102,7 @@ _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); -### `_.templateSettings` +### `_.templateSettings` *(Object)*: By default, Lo-Dash uses ERB-style template delimiters, change the following template settings to use alternative delimiters. [▲][1] @@ -2111,7 +2111,7 @@ _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); -### `_.templateSettings.escape` +### `_.templateSettings.escape` *(RegExp)*: Used to detect `data` property values to be HTML-escaped. [▲][1] @@ -2120,7 +2120,7 @@ _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); -### `_.templateSettings.evaluate` +### `_.templateSettings.evaluate` *(RegExp)*: Used to detect code to be evaluated. [▲][1] @@ -2129,7 +2129,7 @@ _.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]); -### `_.templateSettings.interpolate` +### `_.templateSettings.interpolate` *(RegExp)*: Used to detect `data` property values to inject. [▲][1] diff --git a/lodash.js b/lodash.js index fe8cad702..e3229dd70 100644 --- a/lodash.js +++ b/lodash.js @@ -266,7 +266,6 @@ } var args = options.args, - exits = options.exits, firstArg = /^[^,]+/.exec(args)[0], init = options.init, iterate = options.iterate, @@ -286,8 +285,7 @@ ('var index, result' + (init ? '=' + init : '')) + ';\n' + // exit early if first argument, e.g. `collection`, is nullish or custom expression 'if (' + (options.exitsExp || firstArg + ' == undefined') + ')\n' + - // IE < 9 JScript will throw a syntax error if it encounters `return throw ...` - (/^throw\b/.test(exits) ? '' : 'return ') + (exits || 'result') + ';\n' + + 'return ' + (options.exits || 'result') + ';\n' + // add code after the exits if-statement but before the array/object iteration branches (options.top || '') + ';\n' + // the following branch is for iterating arrays and array-like objects @@ -2209,8 +2207,7 @@ */ var keys = nativeKeys || iterationFactory({ 'args': 'object', - 'exitsExp': 'object !== Object(object)', - 'exits': 'throw TypeError()', + 'exitsExp': '"key" in object, false', 'init': '[]', 'inLoop': 'result.push(index)' }); diff --git a/lodash.min.js b/lodash.min.js index 17e9e7859..5bb0e0b14 100644 --- a/lodash.min.js +++ b/lodash.min.js @@ -2,25 +2,25 @@ Lo-Dash 0.1.0 github.com/bestiejs/lodash/blob/master/LICENSE.txt Underscore.js 1.3.3 github.com/documentcloud/underscore/blob/master/LICENSE */ -;(function(p,i){"use strict";var l=!0,n=!1;function Q(a){return"[object Arguments]"==j.call(a)}function h(a){return new o(a)}function o(a){this.o=a}function g(){for(var a,b=-1,c={},d={},e={},f=["c","j","g"];++b>1,(c?c(a[d]):a[d])a.length&&(b=l);I(c,function(c,f,g){if(b?ha(c)!==f||!c.length:0> -C(c,f))c.push(f),d.push(a[g]);return c},[]);return d}function r(a,b){var c=m.call(arguments,2),d=c.length;return function(){c.length=d;F.apply(c,arguments);return a.apply(b,c)}}function ja(a,b,c){var d;return function(){var e=arguments,f=this;c&&!d&&a.apply(f,e);ua(d);d=J(function(){d=i;c||a.apply(f,e)},b)}}function W(a,b,c){c||(c=[]);if(a===b)return 0!==a||1/a==1/b;if(a==i||b==i)return a===b;a.p&&(a=a.o);b.p&&(b=b.o);if(a.isEqual&&s(a.isEqual))return a.isEqual(b);if(b.isEqual&&s(b.isEqual))return b.isEqual(a); -var d=j.call(a);if(d!=j.call(b))return n;switch(d){case E:return a==""+b;case K:return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case ka:case la:return+a==+b;case ma:return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return n;for(var e=c.length;e--;)if(c[e]==a)return l;var e=l,f=0;c.push(a);if(d==A){if(f=a.length,e=f==b.length)for(;f--&&(e=f in a==f in b&&W(a[f],b[f],c)););}else{if("constructor"in a!="constructor"in b|| -a.constructor!=b.constructor)return n;for(var g in a)if(q.call(a,g)&&(f++,!(e=q.call(b,g)&&W(a[g],b[g],c))))break;if(e){for(g in b)if(q.call(b,g)&&!f--)break;e=!f}}c.pop();return e}function s(a){return j.call(a)==aa}function ba(a){return a}function na(a){t(L(a),function(b){var c=h[b]=a[b];h.prototype[b]=function(){var a=[this.o];F.apply(a,arguments);a=c.apply(h,a);return this.p?(new o(a)).chain():a}})}var x={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"};(function(){for(var a in x)x[x[a]]= -a})();var X="object"==typeof exports&&exports&&("object"==typeof global&&global&&global==global.global&&(p=global),exports),va=0,wa=p._,xa=/\\|'|\r|\n|\t|\u2028|\u2029/g,Y=/.^/,ta=/\\(\\|'|r|n|t|u2028|u2029)/g,A="[object Array]",ka="[object Boolean]",la="[object Date]",aa="[object Function]",K="[object Number]",ma="[object RegExp]",E="[object String]",y=Array.prototype,M=Object.prototype,B=y.concat,q=M.hasOwnProperty,F=y.push,m=y.slice,j=M.toString,ya=p.isFinite,M=Object.keys,ua=p.clearTimeout,J= -p.setTimeout,N={a:"c",h:"[]",m:"var M=j.apply([],D.call(arguments,1))",g:"if(q(M,c[p])<0)C.push(c[p])"},u={h:"J",g:"if(!f(h[p],p,h))return!C"},Z={a:"x",h:"x",m:"for(var E,j=1,w=arguments.length;j=i)i=k,C=h[p]"},D=Array.isArray||function(a){return j.call(a)==A},ca=g({a:"L",i:"b",h:"J",m:"var g=I.call(L);if(g==d||g==F)return!L.length",g:"return l"}),oa=g({a:"h,G",h:"l",g:"if(h[p]===G)return J"}),V=g(k,u),U=g(k,z),pa=g(k,{g:"if(f(h[p],p,h))return h[p]"}),t=g(k),za=g(k,{h:"{}",m:"var A,v=I.call(f)==m;if(v&&H)f=e(f,H)",g:"A=v?f(h[p],p,h):h[p][f];(C[A]||(C[A]=[])).push(h[p])"}),H=g(k,v),qa=g(k,w),w=g(k,w,{m:w.m.replace("-","").replace("max","min"),g:w.g.replace(">=", -"<")}),O=g(v,{a:"h,B",g:{b:"C[p]=h[p][B]",k:"C.push(h[p][B])"}}),I=g({a:"h,f,a,H",h:"a",m:"var s=arguments.length>2;if(H)f=e(f,H)",c:{b:"if(!s)C=h[++p]"},g:{b:"C=f(C,h[p],p,h)",k:"C=s?f(C,h[p],p,h):(s=J,h[p])"}}),z=g(k,z,{g:"!"+z.g}),u=g(k,u,{h:"l",g:u.g.replace("!","")}),ra=g(v,{a:"h",g:{b:"C[p]=h[p]",k:"C.push(h[p])"}}),k=g({a:"c",h:"[]",g:"if(c[p])C.push(c[p])"}),Aa=g(N),v=g(v,{a:"c,z",m:"var b=D.call(arguments,2),v=I.call(z)==m",g:"C[p]=(v?z:c[p][z]).apply(c[p],b)"}),N=g(N,{h:"[]",m:"var M=D.call(arguments,1)"}), -sa=g(Z,{g:"if(x[p]==K)"+Z.g}),P=g(Z),L=g({a:"x",h:"[]",n:n,g:"if(I.call(x[p])==m)C.push(p)",l:"C.sort()"});Q(arguments)||(Q=function(a){return!(!a||!q.call(a,"callee"))});var S=M||g({a:"x",f:"x!==Object(x)",e:"throw TypeError()",h:"[]",g:"C.push(p)"});P(h,{VERSION:"0.1.0",templateSettings:{escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g},after:function(a,b){return 1>a?b():function(){if(1>--a)return b.apply(this,arguments)}},bind:r,bindAll:function(a){var b=arguments, -c=1;1==b.length&&(c=0,b=L(a));for(var d=b.length;c/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},every:V,extend:P,filter:U,find:pa,first:T,flatten:fa,forEach:t,functions:L,groupBy:za,has:function(a,b){return q.call(a,b)},identity:ba,indexOf:C,initial:function(a,b,c){return m.call(a,0,-(b==i||c?1:b))},intersection:ga,invoke:v,isArguments:Q,isArray:D,isBoolean:function(a){return a=== -l||a===n||j.call(a)==ka},isDate:function(a){return j.call(a)==la},isElement:function(a){return!!(a&&1==a.nodeType)},isEmpty:ca,isEqual:W,isFinite:function(a){return ya(a)&&j.call(a)==K},isFunction:s,isNaN:function(a){return j.call(a)==K&&a!=+a},isNull:function(a){return null===a},isNumber:function(a){return j.call(a)==K},isObject:function(a){return a===Object(a)},isRegExp:function(a){return j.call(a)==ma},isString:function(a){return j.call(a)==E},isUndefined:function(a){return a===i},keys:S,last:ha, -lastIndexOf:function(a,b){if(a==i)return-1;for(var c=a.length;c--;)if(a[c]===b)return c;return-1},map:H,max:qa,memoize:function(a,b){var c={};return function(){var d=b?b.apply(this,arguments):arguments[0];return q.call(c,d)?c[d]:c[d]=a.apply(this,arguments)}},min:w,mixin:na,noConflict:function(){p._=wa;return this},once:function(a){var b,c=n;return function(){if(c)return b;c=l;return b=a.apply(this,arguments)}},pick:function(a){for(var b,c=0,d=B.apply([],arguments),e=d.length,f={};++carguments.length&&(b=a||0,a=0);for(var d=-1,e=Math.max(Math.ceil((b-a)/c),0),f=Array(e);++dd?1:0}),"b")},sortedIndex:ea,tap:function(a,b){b(a);return a},template:function(a,b,c){function d(a){return e.call(this,a,h)}c=sa(c||{},h.templateSettings);a="__p+='"+a.replace(xa,function(a){return"\\"+x[a]}).replace(c.escape||Y,function(a,b){return"'+((__t=("+R(b)+"))==null?'':_['escape'](__t))+'"}).replace(c.interpolate|| -Y,function(a,b){return"'+((__t=("+R(b)+"))==null?'':__t)+'"}).replace(c.evaluate||Y,function(a,b){return"';"+R(b)+";__p+='"})+"';\n";c.variable||(a="with(object||{}){"+a+"}");var a='var __t,__j=Array.prototype.join,__p="";function print(){__p+=__j.call(arguments,"")}'+a+"return __p",e=Function(c.variable||"object","_",a);if(b)return e(b,h);d.source="function("+(c.variable||"object")+"){"+a+"}";return d},throttle:function(a,b){var c,d,e,f,g,h,j=ja(function(){d=g=n},b);return function(){c=arguments; -f=this;h||(h=J(function(){h=i;d&&a.apply(f,c);j()},b));g?d=l:e=a.apply(f,c);j();g=l;return e}},times:function(a,b,c){c&&(b=r(b,c));for(c=0;c>1,(c?c(a[d]):a[d])a.length&&(b=m);J(c,function(c,f,j){if(b?ha(c)!==f||!c.length:0>D(c,f))c.push(f),d.push(a[j]); +return c},[]);return d}function s(a,b){var c=n.call(arguments,2),d=c.length;return function(){c.length=d;G.apply(c,arguments);return a.apply(b,c)}}function ja(a,b,c){var d;return function(){var e=arguments,f=this;c&&!d&&a.apply(f,e);ua(d);d=K(function(){d=h;c||a.apply(f,e)},b)}}function X(a,b,c){c||(c=[]);if(a===b)return 0!==a||1/a==1/b;if(a==h||b==h)return a===b;a.p&&(a=a.o);b.p&&(b=b.o);if(a.isEqual&&t(a.isEqual))return a.isEqual(b);if(b.isEqual&&t(b.isEqual))return b.isEqual(a);var d=k.call(a); +if(d!=k.call(b))return o;switch(d){case F:return a==""+b;case L:return a!=+a?b!=+b:0==a?1/a==1/b:a==+b;case ka:case la:return+a==+b;case ma:return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if("object"!=typeof a||"object"!=typeof b)return o;for(var e=c.length;e--;)if(c[e]==a)return m;var e=m,f=0;c.push(a);if(d==B){if(f=a.length,e=f==b.length)for(;f--&&(e=f in a==f in b&&X(a[f],b[f],c)););}else{if("constructor"in a!="constructor"in b||a.constructor!= +b.constructor)return o;for(var j in a)if(r.call(a,j)&&(f++,!(e=r.call(b,j)&&X(a[j],b[j],c))))break;if(e){for(j in b)if(r.call(b,j)&&!f--)break;e=!f}}c.pop();return e}function t(a){return k.call(a)==aa}function ba(a){return a}function na(a){u(M(a),function(b){var c=i[b]=a[b];i.prototype[b]=function(){var a=[this.o];G.apply(a,arguments);a=c.apply(i,a);return this.p?(new p(a)).chain():a}})}var y={"\\":"\\","'":"'",r:"\r",n:"\n",t:"\t",u2028:"\u2028",u2029:"\u2029"};(function(){for(var a in y)y[y[a]]= +a})();var Y="object"==typeof exports&&exports&&("object"==typeof global&&global&&global==global.global&&(q=global),exports),va=0,wa=q._,xa=/\\|'|\r|\n|\t|\u2028|\u2029/g,Z=/.^/,ta=/\\(\\|'|r|n|t|u2028|u2029)/g,B="[object Array]",ka="[object Boolean]",la="[object Date]",aa="[object Function]",L="[object Number]",ma="[object RegExp]",F="[object String]",z=Array.prototype,N=Object.prototype,C=z.concat,r=N.hasOwnProperty,G=z.push,n=z.slice,k=N.toString,ya=q.isFinite,N=Object.keys,ua=q.clearTimeout,K= +q.setTimeout,O={a:"c",h:"[]",m:"var M=j.apply([],D.call(arguments,1))",g:"if(q(M,c[p])<0)C.push(c[p])"},v={h:"J",g:"if(!f(h[p],p,h))return!C"},$={a:"x",h:"x",m:"for(var E,j=1,w=arguments.length;j=i)i=k,C=h[p]"},E=Array.isArray||function(a){return k.call(a)==B},ca=g({a:"L",i:"b",h:"J",m:"var g=I.call(L);if(g==d||g==F)return!L.length",g:"return l"}),oa=g({a:"h,G",h:"l",g:"if(h[p]===G)return J"}),W=g(l,v),V=g(l,A),pa=g(l,{g:"if(f(h[p],p,h))return h[p]"}),u=g(l),za=g(l,{h:"{}",m:"var A,v=I.call(f)==m;if(v&&H)f=e(f,H)",g:"A=v?f(h[p],p,h):h[p][f];(C[A]||(C[A]=[])).push(h[p])"}),I=g(l,w),qa=g(l,x),x=g(l,x,{m:x.m.replace("-","").replace("max","min"),g:x.g.replace(">=", +"<")}),P=g(w,{a:"h,B",g:{b:"C[p]=h[p][B]",k:"C.push(h[p][B])"}}),J=g({a:"h,f,a,H",h:"a",m:"var s=arguments.length>2;if(H)f=e(f,H)",c:{b:"if(!s)C=h[++p]"},g:{b:"C=f(C,h[p],p,h)",k:"C=s?f(C,h[p],p,h):(s=J,h[p])"}}),A=g(l,A,{g:"!"+A.g}),v=g(l,v,{h:"l",g:v.g.replace("!","")}),ra=g(w,{a:"h",g:{b:"C[p]=h[p]",k:"C.push(h[p])"}}),l=g({a:"c",h:"[]",g:"if(c[p])C.push(c[p])"}),Aa=g(O),w=g(w,{a:"c,z",m:"var b=D.call(arguments,2),v=I.call(z)==m",g:"C[p]=(v?z:c[p][z]).apply(c[p],b)"}),O=g(O,{h:"[]",m:"var M=D.call(arguments,1)"}), +sa=g($,{g:"if(x[p]==K)"+$.g}),Q=g($),M=g({a:"x",h:"[]",n:o,g:"if(I.call(x[p])==m)C.push(p)",l:"C.sort()"});R(arguments)||(R=function(a){return!(!a||!r.call(a,"callee"))});var T=N||g({a:"x",f:'"key" in x,l',h:"[]",g:"C.push(p)"});Q(i,{VERSION:"0.1.0",templateSettings:{escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g},after:function(a,b){return 1>a?b():function(){if(1>--a)return b.apply(this,arguments)}},bind:s,bindAll:function(a){var b=arguments,c=1;1==b.length&& +(c=0,b=M(a));for(var d=b.length;c/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")},every:W,extend:Q,filter:V,find:pa,first:U,flatten:fa,forEach:u,functions:M,groupBy:za,has:function(a,b){return r.call(a,b)},identity:ba,indexOf:D,initial:function(a,b,c){return n.call(a,0,-(b==h||c?1:b))},intersection:ga,invoke:w,isArguments:R,isArray:E,isBoolean:function(a){return a===m||a===o||k.call(a)==ka}, +isDate:function(a){return k.call(a)==la},isElement:function(a){return!!(a&&1==a.nodeType)},isEmpty:ca,isEqual:X,isFinite:function(a){return ya(a)&&k.call(a)==L},isFunction:t,isNaN:function(a){return k.call(a)==L&&a!=+a},isNull:function(a){return null===a},isNumber:function(a){return k.call(a)==L},isObject:function(a){return a===Object(a)},isRegExp:function(a){return k.call(a)==ma},isString:function(a){return k.call(a)==F},isUndefined:function(a){return a===h},keys:T,last:ha,lastIndexOf:function(a, +b){if(a==h)return-1;for(var c=a.length;c--;)if(a[c]===b)return c;return-1},map:I,max:qa,memoize:function(a,b){var c={};return function(){var d=b?b.apply(this,arguments):arguments[0];return r.call(c,d)?c[d]:c[d]=a.apply(this,arguments)}},min:x,mixin:na,noConflict:function(){q._=wa;return this},once:function(a){var b,c=o;return function(){if(c)return b;c=m;return b=a.apply(this,arguments)}},pick:function(a){for(var b,c=0,d=C.apply([],arguments),e=d.length,f={};++carguments.length&&(b=a||0,a=0);for(var d=-1,e=Math.max(Math.ceil((b-a)/c),0),f=Array(e);++dd?1:0}),"b")},sortedIndex:ea,tap:function(a,b){b(a);return a},template:function(a,b,c){function d(a){return e.call(this,a,i)}c=sa(c||{},i.templateSettings);a="__p+='"+a.replace(xa,function(a){return"\\"+y[a]}).replace(c.escape||Z,function(a,b){return"'+((__t=("+S(b)+"))==null?'':_['escape'](__t))+'"}).replace(c.interpolate||Z,function(a, +b){return"'+((__t=("+S(b)+"))==null?'':__t)+'"}).replace(c.evaluate||Z,function(a,b){return"';"+S(b)+";__p+='"})+"';\n";c.variable||(a="with(object||{}){"+a+"}");var a='var __t,__j=Array.prototype.join,__p="";function print(){__p+=__j.call(arguments,"")}'+a+"return __p",e=Function(c.variable||"object","_",a);if(b)return e(b,i);d.source="function("+(c.variable||"object")+"){"+a+"}";return d},throttle:function(a,b){var c,d,e,f,g,i,k=ja(function(){d=g=o},b);return function(){c=arguments;f=this;i||(i= +K(function(){i=h;d&&a.apply(f,c);k()},b));g?d=m:e=a.apply(f,c);k();g=m;return e}},times:function(a,b,c){c&&(b=s(b,c));for(c=0;c