mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-09 18:37:50 +00:00
Add _.defaultsDeep.
This commit is contained in:
161
lodash.src.js
161
lodash.src.js
@@ -3294,6 +3294,25 @@
|
|||||||
return curryFunc;
|
return curryFunc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a `_.defaults` or `_.defaultsDeep` function.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} assigner The function to assign values.
|
||||||
|
* @param {Function} customizer The function to customize assigned values.
|
||||||
|
* @returns {Function} Returns the new defaults function.
|
||||||
|
*/
|
||||||
|
function createDefaults(assigner, customizer) {
|
||||||
|
return restParam(function(args) {
|
||||||
|
var object = args[0];
|
||||||
|
if (object == null) {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
args.push(customizer);
|
||||||
|
return assigner.apply(undefined, args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a `_.max` or `_.min` function.
|
* Creates a `_.max` or `_.min` function.
|
||||||
*
|
*
|
||||||
@@ -4344,6 +4363,18 @@
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used by `_.defaultsDeep` to customize its `_.merge` use.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {*} objectValue The destination object property value.
|
||||||
|
* @param {*} sourceValue The source object property value.
|
||||||
|
* @returns {*} Returns the value to assign to the destination object.
|
||||||
|
*/
|
||||||
|
function mergeDefaults(objectValue, sourceValue) {
|
||||||
|
return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A specialized version of `_.pick` which picks `object` properties specified
|
* A specialized version of `_.pick` which picks `object` properties specified
|
||||||
* by `props`.
|
* by `props`.
|
||||||
@@ -9238,6 +9269,56 @@
|
|||||||
|
|
||||||
/*------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively merges own enumerable properties of the source object(s), that
|
||||||
|
* don't resolve to `undefined` into the destination object. Subsequent sources
|
||||||
|
* overwrite property assignments of previous sources. If `customizer` is
|
||||||
|
* provided it is invoked to produce the merged values of the destination and
|
||||||
|
* source properties. If `customizer` returns `undefined` merging is handled
|
||||||
|
* by the method instead. The `customizer` is bound to `thisArg` and invoked
|
||||||
|
* with five arguments: (objectValue, sourceValue, key, object, source).
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @category Object
|
||||||
|
* @param {Object} object The destination object.
|
||||||
|
* @param {...Object} [sources] The source objects.
|
||||||
|
* @param {Function} [customizer] The function to customize assigned values.
|
||||||
|
* @param {*} [thisArg] The `this` binding of `customizer`.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* var users = {
|
||||||
|
* 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* var ages = {
|
||||||
|
* 'data': [{ 'age': 36 }, { 'age': 40 }]
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* _.merge(users, ages);
|
||||||
|
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
|
||||||
|
*
|
||||||
|
* // using a customizer callback
|
||||||
|
* var object = {
|
||||||
|
* 'fruits': ['apple'],
|
||||||
|
* 'vegetables': ['beet']
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* var other = {
|
||||||
|
* 'fruits': ['banana'],
|
||||||
|
* 'vegetables': ['carrot']
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* _.merge(object, other, function(a, b) {
|
||||||
|
* if (_.isArray(a)) {
|
||||||
|
* return a.concat(b);
|
||||||
|
* }
|
||||||
|
* });
|
||||||
|
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
|
||||||
|
*/
|
||||||
|
var merge = createAssigner(baseMerge);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assigns own enumerable properties of source object(s) to the destination
|
* Assigns own enumerable properties of source object(s) to the destination
|
||||||
* object. Subsequent sources overwrite property assignments of previous sources.
|
* object. Subsequent sources overwrite property assignments of previous sources.
|
||||||
@@ -9336,14 +9417,27 @@
|
|||||||
* _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
|
* _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
|
||||||
* // => { 'user': 'barney', 'age': 36 }
|
* // => { 'user': 'barney', 'age': 36 }
|
||||||
*/
|
*/
|
||||||
var defaults = restParam(function(args) {
|
var defaults = createDefaults(assign, assignDefaults);
|
||||||
var object = args[0];
|
|
||||||
if (object == null) {
|
/**
|
||||||
return object;
|
* This method is like `_.defaults` except that it recursively assigns
|
||||||
}
|
* default properties.
|
||||||
args.push(assignDefaults);
|
*
|
||||||
return assign.apply(undefined, args);
|
* **Note:** This method mutates `object`.
|
||||||
});
|
*
|
||||||
|
* @static
|
||||||
|
* @memberOf _
|
||||||
|
* @category Object
|
||||||
|
* @param {Object} object The destination object.
|
||||||
|
* @param {...Object} [sources] The source objects.
|
||||||
|
* @returns {Object} Returns `object`.
|
||||||
|
* @example
|
||||||
|
*
|
||||||
|
* _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
|
||||||
|
* // => { 'user': { 'name': 'barney', 'age': 36 } }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var defaultsDeep = createDefaults(merge, mergeDefaults);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method is like `_.find` except that it returns the key of the first
|
* This method is like `_.find` except that it returns the key of the first
|
||||||
@@ -9875,56 +9969,6 @@
|
|||||||
*/
|
*/
|
||||||
var mapValues = createObjectMapper();
|
var mapValues = createObjectMapper();
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursively merges own enumerable properties of the source object(s), that
|
|
||||||
* don't resolve to `undefined` into the destination object. Subsequent sources
|
|
||||||
* overwrite property assignments of previous sources. If `customizer` is
|
|
||||||
* provided it is invoked to produce the merged values of the destination and
|
|
||||||
* source properties. If `customizer` returns `undefined` merging is handled
|
|
||||||
* by the method instead. The `customizer` is bound to `thisArg` and invoked
|
|
||||||
* with five arguments: (objectValue, sourceValue, key, object, source).
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @memberOf _
|
|
||||||
* @category Object
|
|
||||||
* @param {Object} object The destination object.
|
|
||||||
* @param {...Object} [sources] The source objects.
|
|
||||||
* @param {Function} [customizer] The function to customize assigned values.
|
|
||||||
* @param {*} [thisArg] The `this` binding of `customizer`.
|
|
||||||
* @returns {Object} Returns `object`.
|
|
||||||
* @example
|
|
||||||
*
|
|
||||||
* var users = {
|
|
||||||
* 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* var ages = {
|
|
||||||
* 'data': [{ 'age': 36 }, { 'age': 40 }]
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* _.merge(users, ages);
|
|
||||||
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
|
|
||||||
*
|
|
||||||
* // using a customizer callback
|
|
||||||
* var object = {
|
|
||||||
* 'fruits': ['apple'],
|
|
||||||
* 'vegetables': ['beet']
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* var other = {
|
|
||||||
* 'fruits': ['banana'],
|
|
||||||
* 'vegetables': ['carrot']
|
|
||||||
* };
|
|
||||||
*
|
|
||||||
* _.merge(object, other, function(a, b) {
|
|
||||||
* if (_.isArray(a)) {
|
|
||||||
* return a.concat(b);
|
|
||||||
* }
|
|
||||||
* });
|
|
||||||
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
|
|
||||||
*/
|
|
||||||
var merge = createAssigner(baseMerge);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The opposite of `_.pick`; this method creates an object composed of the
|
* The opposite of `_.pick`; this method creates an object composed of the
|
||||||
* own and inherited enumerable properties of `object` that are not omitted.
|
* own and inherited enumerable properties of `object` that are not omitted.
|
||||||
@@ -11991,6 +12035,7 @@
|
|||||||
lodash.curryRight = curryRight;
|
lodash.curryRight = curryRight;
|
||||||
lodash.debounce = debounce;
|
lodash.debounce = debounce;
|
||||||
lodash.defaults = defaults;
|
lodash.defaults = defaults;
|
||||||
|
lodash.defaultsDeep = defaultsDeep;
|
||||||
lodash.defer = defer;
|
lodash.defer = defer;
|
||||||
lodash.delay = delay;
|
lodash.delay = delay;
|
||||||
lodash.difference = difference;
|
lodash.difference = difference;
|
||||||
|
|||||||
@@ -17949,7 +17949,7 @@
|
|||||||
|
|
||||||
var acceptFalsey = _.difference(allMethods, rejectFalsey);
|
var acceptFalsey = _.difference(allMethods, rejectFalsey);
|
||||||
|
|
||||||
test('should accept falsey arguments', 228, function() {
|
test('should accept falsey arguments', 229, function() {
|
||||||
var emptyArrays = _.map(falsey, _.constant([])),
|
var emptyArrays = _.map(falsey, _.constant([])),
|
||||||
isExposed = '_' in root,
|
isExposed = '_' in root,
|
||||||
oldDash = root._;
|
oldDash = root._;
|
||||||
|
|||||||
Reference in New Issue
Block a user