mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-12 11:57:49 +00:00
Ensure _.merge handles source arrays with undefined values correctly with a customizer.
This commit is contained in:
21
lodash.js
21
lodash.js
@@ -2490,11 +2490,13 @@
|
|||||||
value = object[key];
|
value = object[key];
|
||||||
|
|
||||||
if (!(isArr || isObj)) {
|
if (!(isArr || isObj)) {
|
||||||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined;
|
var result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||||||
if (typeof result == 'undefined') {
|
isCommon = typeof result == 'undefined';
|
||||||
|
|
||||||
|
if (isCommon) {
|
||||||
result = srcValue;
|
result = srcValue;
|
||||||
}
|
}
|
||||||
if ((isSrcArr || typeof result != 'undefined') && !(customizer && result === value)) {
|
if ((isSrcArr || typeof result != 'undefined') && (isCommon || result !== value)) {
|
||||||
object[key] = result;
|
object[key] = result;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -2510,10 +2512,10 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
result = customizer ? customizer(value, srcValue, key, object, source) : undefined;
|
||||||
isDeep = typeof result == 'undefined';
|
isCommon = typeof result == 'undefined';
|
||||||
|
|
||||||
if (isDeep) {
|
if (isCommon) {
|
||||||
result = isArr
|
result = isArr
|
||||||
? (isArray(value) ? value : [])
|
? (isArray(value) ? value : [])
|
||||||
: (isPlainObject(value) ? value : {});
|
: (isPlainObject(value) ? value : {});
|
||||||
@@ -2524,10 +2526,9 @@
|
|||||||
stackB.push(result);
|
stackB.push(result);
|
||||||
|
|
||||||
// Recursively merge objects and arrays (susceptible to call stack limits).
|
// Recursively merge objects and arrays (susceptible to call stack limits).
|
||||||
if (isDeep) {
|
if (isCommon) {
|
||||||
baseMerge(result, srcValue, customizer, stackA, stackB);
|
object[key] = baseMerge(result, srcValue, customizer, stackA, stackB);
|
||||||
}
|
} else if (result !== value) {
|
||||||
if (!(customizer && result === value)) {
|
|
||||||
object[key] = result;
|
object[key] = result;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8478,15 +8478,19 @@
|
|||||||
deepEqual(actual, { 'a': 1 });
|
deepEqual(actual, { 'a': 1 });
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should handle merging if `customizer` returns `undefined`', 1, function() {
|
test('should handle merging if `customizer` returns `undefined`', 2, function() {
|
||||||
var actual = _.merge({ 'a': { 'b': [1, 1] } }, { 'a': { 'b': [0] } }, _.noop);
|
var actual = _.merge({ 'a': { 'b': [1, 1] } }, { 'a': { 'b': [0] } }, _.noop);
|
||||||
deepEqual(actual, { 'a': { 'b': [0, 1] } });
|
deepEqual(actual, { 'a': { 'b': [0, 1] } });
|
||||||
|
|
||||||
|
actual = _.merge([], [undefined], _.identity);
|
||||||
|
deepEqual(actual, [undefined]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('should defer to `customizer` when it returns a value other than `undefined`', 1, function() {
|
test('should defer to `customizer` when it returns a value other than `undefined`', 1, function() {
|
||||||
var actual = _.merge({ 'a': { 'b': [0, 1] } }, { 'a': { 'b': [2] } }, function(a, b) {
|
var actual = _.merge({ 'a': { 'b': [0, 1] } }, { 'a': { 'b': [2] } }, function(a, b) {
|
||||||
return _.isArray(a) ? a.concat(b) : undefined;
|
return _.isArray(a) ? a.concat(b) : undefined;
|
||||||
});
|
});
|
||||||
|
|
||||||
deepEqual(actual, { 'a': { 'b': [0, 1, 2] } });
|
deepEqual(actual, { 'a': { 'b': [0, 1, 2] } });
|
||||||
});
|
});
|
||||||
}(1, 2, 3));
|
}(1, 2, 3));
|
||||||
|
|||||||
Reference in New Issue
Block a user