mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-13 12:27:49 +00:00
Update vendor/underscore to 1.5.2.
This commit is contained in:
148
vendor/underscore/underscore.js
vendored
148
vendor/underscore/underscore.js
vendored
@@ -1,4 +1,4 @@
|
||||
// Underscore.js 1.5.1
|
||||
// Underscore.js 1.5.2
|
||||
// http://underscorejs.org
|
||||
// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
||||
// Underscore may be freely distributed under the MIT license.
|
||||
@@ -8,7 +8,7 @@
|
||||
// Baseline setup
|
||||
// --------------
|
||||
|
||||
// Establish the root object, `window` in the browser, or `global` on the server.
|
||||
// Establish the root object, `window` in the browser, or `exports` on the server.
|
||||
var root = this;
|
||||
|
||||
// Save the previous value of the `_` variable.
|
||||
@@ -65,7 +65,7 @@
|
||||
}
|
||||
|
||||
// Current version.
|
||||
_.VERSION = '1.5.1';
|
||||
_.VERSION = '1.5.2';
|
||||
|
||||
// Collection Functions
|
||||
// --------------------
|
||||
@@ -78,14 +78,13 @@
|
||||
if (nativeForEach && obj.forEach === nativeForEach) {
|
||||
obj.forEach(iterator, context);
|
||||
} else if (obj.length === +obj.length) {
|
||||
for (var i = 0, l = obj.length; i < l; i++) {
|
||||
for (var i = 0, length = obj.length; i < length; i++) {
|
||||
if (iterator.call(context, obj[i], i, obj) === breaker) return;
|
||||
}
|
||||
} else {
|
||||
for (var key in obj) {
|
||||
if (_.has(obj, key)) {
|
||||
if (iterator.call(context, obj[key], key, obj) === breaker) return;
|
||||
}
|
||||
var keys = _.keys(obj);
|
||||
for (var i = 0, length = keys.length; i < length; i++) {
|
||||
if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -284,7 +283,8 @@
|
||||
return result.value;
|
||||
};
|
||||
|
||||
// Shuffle an array.
|
||||
// Shuffle an array, using the modern version of the
|
||||
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
|
||||
_.shuffle = function(obj) {
|
||||
var rand;
|
||||
var index = 0;
|
||||
@@ -297,6 +297,16 @@
|
||||
return shuffled;
|
||||
};
|
||||
|
||||
// Sample **n** random values from an array.
|
||||
// If **n** is not specified, returns a single random element from the array.
|
||||
// The internal `guard` argument allows it to work with `map`.
|
||||
_.sample = function(obj, n, guard) {
|
||||
if (arguments.length < 2 || guard) {
|
||||
return obj[_.random(obj.length - 1)];
|
||||
}
|
||||
return _.shuffle(obj).slice(0, Math.max(0, n));
|
||||
};
|
||||
|
||||
// An internal function to generate lookup iterators.
|
||||
var lookupIterator = function(value) {
|
||||
return _.isFunction(value) ? value : function(obj){ return obj[value]; };
|
||||
@@ -307,9 +317,9 @@
|
||||
var iterator = lookupIterator(value);
|
||||
return _.pluck(_.map(obj, function(value, index, list) {
|
||||
return {
|
||||
value : value,
|
||||
index : index,
|
||||
criteria : iterator.call(context, value, index, list)
|
||||
value: value,
|
||||
index: index,
|
||||
criteria: iterator.call(context, value, index, list)
|
||||
};
|
||||
}).sort(function(left, right) {
|
||||
var a = left.criteria;
|
||||
@@ -318,38 +328,41 @@
|
||||
if (a > b || a === void 0) return 1;
|
||||
if (a < b || b === void 0) return -1;
|
||||
}
|
||||
return left.index < right.index ? -1 : 1;
|
||||
return left.index - right.index;
|
||||
}), 'value');
|
||||
};
|
||||
|
||||
// An internal function used for aggregate "group by" operations.
|
||||
var group = function(obj, value, context, behavior) {
|
||||
var result = {};
|
||||
var iterator = lookupIterator(value == null ? _.identity : value);
|
||||
each(obj, function(value, index) {
|
||||
var key = iterator.call(context, value, index, obj);
|
||||
behavior(result, key, value);
|
||||
});
|
||||
return result;
|
||||
var group = function(behavior) {
|
||||
return function(obj, value, context) {
|
||||
var result = {};
|
||||
var iterator = value == null ? _.identity : lookupIterator(value);
|
||||
each(obj, function(value, index) {
|
||||
var key = iterator.call(context, value, index, obj);
|
||||
behavior(result, key, value);
|
||||
});
|
||||
return result;
|
||||
};
|
||||
};
|
||||
|
||||
// Groups the object's values by a criterion. Pass either a string attribute
|
||||
// to group by, or a function that returns the criterion.
|
||||
_.groupBy = function(obj, value, context) {
|
||||
return group(obj, value, context, function(result, key, value) {
|
||||
(_.has(result, key) ? result[key] : (result[key] = [])).push(value);
|
||||
});
|
||||
};
|
||||
_.groupBy = group(function(result, key, value) {
|
||||
(_.has(result, key) ? result[key] : (result[key] = [])).push(value);
|
||||
});
|
||||
|
||||
// Indexes the object's values by a criterion, similar to `groupBy`, but for
|
||||
// when you know that your index values will be unique.
|
||||
_.indexBy = group(function(result, key, value) {
|
||||
result[key] = value;
|
||||
});
|
||||
|
||||
// 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.
|
||||
_.countBy = function(obj, value, context) {
|
||||
return group(obj, value, context, function(result, key) {
|
||||
if (!_.has(result, key)) result[key] = 0;
|
||||
result[key]++;
|
||||
});
|
||||
};
|
||||
_.countBy = group(function(result, key) {
|
||||
_.has(result, key) ? result[key]++ : result[key] = 1;
|
||||
});
|
||||
|
||||
// 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.
|
||||
@@ -386,7 +399,7 @@
|
||||
// allows it to work with `_.map`.
|
||||
_.first = _.head = _.take = function(array, n, guard) {
|
||||
if (array == null) return void 0;
|
||||
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
|
||||
return (n == null) || guard ? array[0] : slice.call(array, 0, n);
|
||||
};
|
||||
|
||||
// Returns everything but the last entry of the array. Especially useful on
|
||||
@@ -401,10 +414,10 @@
|
||||
// values in the array. The **guard** check allows it to work with `_.map`.
|
||||
_.last = function(array, n, guard) {
|
||||
if (array == null) return void 0;
|
||||
if ((n != null) && !guard) {
|
||||
return slice.call(array, Math.max(array.length - n, 0));
|
||||
} else {
|
||||
if ((n == null) || guard) {
|
||||
return array[array.length - 1];
|
||||
} else {
|
||||
return slice.call(array, Math.max(array.length - n, 0));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -436,7 +449,7 @@
|
||||
return output;
|
||||
};
|
||||
|
||||
// Return a completely flattened version of an array.
|
||||
// Flatten out an array, either recursively (by default), or just one level.
|
||||
_.flatten = function(array, shallow) {
|
||||
return flatten(array, shallow, []);
|
||||
};
|
||||
@@ -508,7 +521,7 @@
|
||||
_.object = function(list, values) {
|
||||
if (list == null) return {};
|
||||
var result = {};
|
||||
for (var i = 0, l = list.length; i < l; i++) {
|
||||
for (var i = 0, length = list.length; i < length; i++) {
|
||||
if (values) {
|
||||
result[list[i]] = values[i];
|
||||
} else {
|
||||
@@ -526,17 +539,17 @@
|
||||
// for **isSorted** to use binary search.
|
||||
_.indexOf = function(array, item, isSorted) {
|
||||
if (array == null) return -1;
|
||||
var i = 0, l = array.length;
|
||||
var i = 0, length = array.length;
|
||||
if (isSorted) {
|
||||
if (typeof isSorted == 'number') {
|
||||
i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
|
||||
i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
|
||||
} else {
|
||||
i = _.sortedIndex(array, item);
|
||||
return array[i] === item ? i : -1;
|
||||
}
|
||||
}
|
||||
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
|
||||
for (; i < l; i++) if (array[i] === item) return i;
|
||||
for (; i < length; i++) if (array[i] === item) return i;
|
||||
return -1;
|
||||
};
|
||||
|
||||
@@ -562,11 +575,11 @@
|
||||
}
|
||||
step = arguments[2] || 1;
|
||||
|
||||
var len = Math.max(Math.ceil((stop - start) / step), 0);
|
||||
var length = Math.max(Math.ceil((stop - start) / step), 0);
|
||||
var idx = 0;
|
||||
var range = new Array(len);
|
||||
var range = new Array(length);
|
||||
|
||||
while(idx < len) {
|
||||
while(idx < length) {
|
||||
range[idx++] = start;
|
||||
start += step;
|
||||
}
|
||||
@@ -678,17 +691,24 @@
|
||||
// N milliseconds. If `immediate` is passed, trigger the function on the
|
||||
// leading edge, instead of the trailing.
|
||||
_.debounce = function(func, wait, immediate) {
|
||||
var result;
|
||||
var timeout = null;
|
||||
var timeout, args, context, timestamp, result;
|
||||
return function() {
|
||||
var context = this, args = arguments;
|
||||
context = this;
|
||||
args = arguments;
|
||||
timestamp = new Date();
|
||||
var later = function() {
|
||||
timeout = null;
|
||||
if (!immediate) result = func.apply(context, args);
|
||||
var last = (new Date()) - timestamp;
|
||||
if (last < wait) {
|
||||
timeout = setTimeout(later, wait - last);
|
||||
} else {
|
||||
timeout = null;
|
||||
if (!immediate) result = func.apply(context, args);
|
||||
}
|
||||
};
|
||||
var callNow = immediate && !timeout;
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
if (!timeout) {
|
||||
timeout = setTimeout(later, wait);
|
||||
}
|
||||
if (callNow) result = func.apply(context, args);
|
||||
return result;
|
||||
};
|
||||
@@ -754,22 +774,33 @@
|
||||
|
||||
// Retrieve the values of an object's properties.
|
||||
_.values = function(obj) {
|
||||
var values = [];
|
||||
for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
|
||||
var keys = _.keys(obj);
|
||||
var length = keys.length;
|
||||
var values = new Array(length);
|
||||
for (var i = 0; i < length; i++) {
|
||||
values[i] = obj[keys[i]];
|
||||
}
|
||||
return values;
|
||||
};
|
||||
|
||||
// Convert an object into a list of `[key, value]` pairs.
|
||||
_.pairs = function(obj) {
|
||||
var pairs = [];
|
||||
for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
|
||||
var keys = _.keys(obj);
|
||||
var length = keys.length;
|
||||
var pairs = new Array(length);
|
||||
for (var i = 0; i < length; i++) {
|
||||
pairs[i] = [keys[i], obj[keys[i]]];
|
||||
}
|
||||
return pairs;
|
||||
};
|
||||
|
||||
// Invert the keys and values of an object. The values must be serializable.
|
||||
_.invert = function(obj) {
|
||||
var result = {};
|
||||
for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
|
||||
var keys = _.keys(obj);
|
||||
for (var i = 0, length = keys.length; i < length; i++) {
|
||||
result[obj[keys[i]]] = keys[i];
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
@@ -1053,8 +1084,7 @@
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'"': '"',
|
||||
"'": ''',
|
||||
'/': '/'
|
||||
"'": '''
|
||||
}
|
||||
};
|
||||
entityMap.unescape = _.invert(entityMap.escape);
|
||||
@@ -1085,7 +1115,7 @@
|
||||
|
||||
// Add your own custom functions to the Underscore object.
|
||||
_.mixin = function(obj) {
|
||||
each(_.functions(obj), function(name){
|
||||
each(_.functions(obj), function(name) {
|
||||
var func = _[name] = obj[name];
|
||||
_.prototype[name] = function() {
|
||||
var args = [this._wrapped];
|
||||
|
||||
Reference in New Issue
Block a user