-
Notifications
You must be signed in to change notification settings - Fork 12
/
merge.js
76 lines (65 loc) · 2.2 KB
/
merge.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
var Utils = {
merge: function() {
// copy reference to target object
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy
// Handle a deep copy situation
if ( typeof target === "boolean" ) {
deep = target
target = arguments[1] || {}
// skip the boolean and the target
i = 2
}
// Handle case when target is a string or something (possible in deep copy)
if ( typeof target !== "object" && typeof(target) !== 'function' ) {
target = {}
}
// extend Picard itself if only one argument is passed
if ( length === i ) {
target = this
--i
}
for ( ; i < length; i++ ) {
// Only deal with non-null/undefined values
if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
src = target[ name ]
copy = options[ name ]
// Prevent never-ending loop
if ( target === copy ) {
continue
}
// Recurse if we're merging object literal values or arrays
if ( deep && copy && ( this.isPlainObject(copy) === 'object' || this.isArray(copy) ) ) {
var clone = src && ( this.isPlainObject(src) || this.isArray(src) ) ? src
: this.isArray(copy) ? [] : {}
// Never move original objects, clone them
target[ name ] = this.merge( deep, clone, copy )
// Don't bring in undefined values
} else if ( copy !== undefined ) {
target[ name ] = copy
}
}
}
}
// Return the modified object
return target
},
isArray: function( obj ) {
return toString.call(obj) === "[object Array]"
},
isPlainObject: function( obj ) {
if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}
if ( obj.constructor
&& !hasOwnProperty.call(obj, "constructor")
&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
var key;
for ( key in obj ) {}
return key === undefined || hasOwnProperty.call( obj, key )
}
}
module.exports = Utils.merge