Skip to content

Commit 452a84e

Browse files
authored
Merge pull request #801 from plotly/extend-deep-no-arrays
Add extendDeepNoArrays variant
2 parents a992b59 + bf0ca36 commit 452a84e

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

src/lib/extend.js

+15-6
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,19 @@ function primitivesLoopSplice(source, target) {
2727
}
2828

2929
exports.extendFlat = function() {
30-
return _extend(arguments, false, false);
30+
return _extend(arguments, false, false, false);
3131
};
3232

3333
exports.extendDeep = function() {
34-
return _extend(arguments, true, false);
34+
return _extend(arguments, true, false, false);
3535
};
3636

3737
exports.extendDeepAll = function() {
38-
return _extend(arguments, true, true);
38+
return _extend(arguments, true, true, false);
39+
};
40+
41+
exports.extendDeepNoArrays = function() {
42+
return _extend(arguments, true, false, true);
3943
};
4044

4145
/*
@@ -55,7 +59,7 @@ exports.extendDeepAll = function() {
5559
* Warning: this might result in infinite loops.
5660
*
5761
*/
58-
function _extend(inputs, isDeep, keepAllKeys) {
62+
function _extend(inputs, isDeep, keepAllKeys, noArrayCopies) {
5963
var target = inputs[0],
6064
length = inputs.length;
6165

@@ -79,8 +83,13 @@ function _extend(inputs, isDeep, keepAllKeys) {
7983
src = target[key];
8084
copy = input[key];
8185

86+
// Stop early and just transfer the array if array copies are disallowed:
87+
if(noArrayCopies && isArray(copy)) {
88+
target[key] = copy;
89+
}
90+
8291
// recurse if we're merging plain objects or arrays
83-
if(isDeep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
92+
else if(isDeep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
8493
if(copyIsArray) {
8594
copyIsArray = false;
8695
clone = src && isArray(src) ? src : [];
@@ -89,7 +98,7 @@ function _extend(inputs, isDeep, keepAllKeys) {
8998
}
9099

91100
// never move original objects, clone them
92-
target[key] = _extend([clone, copy], isDeep, keepAllKeys);
101+
target[key] = _extend([clone, copy], isDeep, keepAllKeys, noArrayCopies);
93102
}
94103

95104
// don't bring in undefined values, except for extendDeepAll

src/lib/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ var extendModule = require('./extend');
5858
lib.extendFlat = extendModule.extendFlat;
5959
lib.extendDeep = extendModule.extendDeep;
6060
lib.extendDeepAll = extendModule.extendDeepAll;
61+
lib.extendDeepNoArrays = extendModule.extendDeepNoArrays;
6162

6263
var loggersModule = require('./loggers');
6364
lib.log = loggersModule.log;

test/jasmine/tests/extend_test.js

+21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var extendModule = require('@src/lib/extend.js');
22
var extendFlat = extendModule.extendFlat;
33
var extendDeep = extendModule.extendDeep;
44
var extendDeepAll = extendModule.extendDeepAll;
5+
var extendDeepNoArrays = extendModule.extendDeepNoArrays;
56

67
var str = 'me a test',
78
integer = 10,
@@ -452,3 +453,23 @@ describe('extendDeepAll', function() {
452453
expect(ori.arr[2]).toBe(undefined);
453454
});
454455
});
456+
457+
describe('extendDeepNoArrays', function() {
458+
'use strict';
459+
460+
it('does not copy arrays', function() {
461+
var src = {foo: {bar: [1, 2, 3], baz: [5, 4, 3]}};
462+
var tar = {foo: {bar: [4, 5, 6], bop: [8, 2, 1]}};
463+
var ext = extendDeepNoArrays(tar, src);
464+
465+
expect(ext).not.toBe(src);
466+
expect(ext).toBe(tar);
467+
468+
expect(ext.foo).not.toBe(src.foo);
469+
expect(ext.foo).toBe(tar.foo);
470+
471+
expect(ext.foo.bar).toBe(src.foo.bar);
472+
expect(ext.foo.baz).toBe(src.foo.baz);
473+
expect(ext.foo.bop).toBe(tar.foo.bop);
474+
});
475+
});

0 commit comments

Comments
 (0)