Skip to content

Commit cfd7f84

Browse files
achingbrainschnittstabil
authored andcommitted
adds option to ignore undefined values
1 parent 37dc96c commit cfd7f84

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

index.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const defineProperty = (obj, name, value) => Object.defineProperty(obj, name, {
1212

1313
const globalThis = this;
1414
const defaultMergeOpts = {
15-
concatArrays: false
15+
concatArrays: false,
16+
ignoreUndefined: false
1617
};
1718

1819
const getEnumerableOwnPropertyKeys = value => {
@@ -76,6 +77,10 @@ function cloneOptionObject(obj) {
7677
*/
7778
const mergeKeys = (merged, source, keys, mergeOpts) => {
7879
keys.forEach(key => {
80+
if (typeof source[key] === 'undefined' && mergeOpts.ignoreUndefined) {
81+
return;
82+
}
83+
7984
// Do not recurse into prototype chain of merged
8085
if (key in merged && merged[key] !== Object.getPrototypeOf(merged)) {
8186
defineProperty(merged, key, merge(merged[key], source[key], mergeOpts));

readme.md

+19
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,25 @@ mergeOptions.apply({concatArrays: true}, [{src: ['src/**']}, {src: ['test/**']}]
8585
//=> {src: ['src/**', 'test/**']}
8686
```
8787

88+
##### config.ignoreUndefined
89+
90+
Type: `boolean`<br/>Default: `false`
91+
92+
Ignore undefined values:
93+
94+
```js
95+
mergeOptions({foo: 'bar'}, {foo: undefined})
96+
//=> {foo: undefined}
97+
98+
// Via call
99+
mergeOptions.call({ignoreUndefined: true}, {foo: 'bar'}, {foo: undefined})
100+
//=> {foo: 'bar'}
101+
102+
// Via apply
103+
mergeOptions.apply({ignoreUndefined: true}, [{foo: 'bar'}, {foo: undefined}])
104+
//=> {foo: 'bar'}
105+
```
106+
88107

89108
## Related
90109

test/undefined-values.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import test from 'ava';
2+
import mergeOptions from '..';
3+
4+
test('undefined values', t => {
5+
t.deepEqual(
6+
mergeOptions.call({ignoreUndefined: true}, {foo: 0}, {foo: undefined}),
7+
{foo: 0}
8+
);
9+
});
10+
11+
test('deep undefined values', t => {
12+
t.deepEqual(
13+
mergeOptions.call({ignoreUndefined: true}, {nested: {unicorns: 'none'}}, {nested: {unicorns: undefined}}),
14+
{nested: {unicorns: 'none'}}
15+
);
16+
});

0 commit comments

Comments
 (0)