Ensure _.merge handles source arrays with undefined values correctly with a customizer.

This commit is contained in:
John-David Dalton
2014-12-27 21:51:13 -06:00
parent 4319cdbba1
commit 46341fea96
2 changed files with 16 additions and 11 deletions

View File

@@ -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;
} }
}); });

View File

@@ -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));