Skip to content

Commit 6fc27c2

Browse files
committed
v1.2.0
1 parent b071d83 commit 6fc27c2

File tree

7 files changed

+298
-85
lines changed

7 files changed

+298
-85
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ cloned.x.y++;
2222

2323
console.log(original.x.y, cloned.x.y);
2424
// -> 1, 2
25+
26+
console.log(merge.recursive(true, original, { x: { z: 2 } }));
27+
// -> {"x": { "y": 1, "z": 2 } }
28+
2529
```
2630

2731
## Browser Usage
@@ -40,6 +44,10 @@ console.log(original.x.y, cloned.x.y);
4044
4145
console.log(original.x.y, cloned.x.y);
4246
// -> 1, 2
47+
48+
console.log(merge.recursive(true, original, { x: { z: 2 } }));
49+
// -> {"x": { "y": 1, "z": 2 } }
50+
4351
</script>
4452
```
4553

bower.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "merge",
3+
"version": "1.2.0",
4+
"homepage": "https://github.com/yeikos/js.merge",
5+
"authors": [
6+
"yeikos <[email protected]>"
7+
],
8+
"description": "Merge multiple objects into one, optionally creating a new cloned object. Similar to the jQuery.extend but more flexible. Works in Node.js and the browser.",
9+
"main": "merge.js",
10+
"keywords": [
11+
"merge",
12+
"recursive",
13+
"extend",
14+
"clone",
15+
"object",
16+
"browser"
17+
],
18+
"license": "MIT",
19+
"ignore": [
20+
"tests"
21+
]
22+
}

merge.js

+116-22
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* @name JavaScript/NodeJS Merge v1.1.3
2+
* @name JavaScript/NodeJS Merge v1.2.0
33
* @author yeikos
44
* @repository https://github.com/yeikos/js.merge
55
@@ -9,31 +9,39 @@
99

1010
;(function(isNode) {
1111

12-
function merge() {
12+
/**
13+
* Merge one or more objects
14+
* @param bool? clone
15+
* @param mixed,... arguments
16+
* @return object
17+
*/
1318

14-
var items = Array.prototype.slice.call(arguments),
15-
result = items.shift(),
16-
deep = (result === true),
17-
size = items.length,
18-
item, index, key;
19+
var Public = function(clone) {
1920

20-
if (deep || typeOf(result) !== 'object')
21+
return merge(clone === true, false, arguments);
2122

22-
result = {};
23-
24-
for (index=0;index<size;++index)
23+
}, publicName = 'merge';
2524

26-
if (typeOf(item = items[index]) === 'object')
25+
/**
26+
* Merge two or more objects recursively
27+
* @param bool? clone
28+
* @param mixed,... arguments
29+
* @return object
30+
*/
2731

28-
for (key in item)
32+
Public.recursive = function(clone) {
2933

30-
result[key] = deep ? clone(item[key]) : item[key];
34+
return merge(clone === true, true, arguments);
3135

32-
return result;
36+
};
3337

34-
}
38+
/**
39+
* Clone the input removing any reference
40+
* @param mixed input
41+
* @return mixed
42+
*/
3543

36-
function clone(input) {
44+
Public.clone = function(input) {
3745

3846
var output = input,
3947
type = typeOf(input),
@@ -46,35 +54,121 @@
4654

4755
for (index=0;index<size;++index)
4856

49-
output[index] = clone(input[index]);
57+
output[index] = Public.clone(input[index]);
5058

5159
} else if (type === 'object') {
5260

5361
output = {};
5462

5563
for (index in input)
5664

57-
output[index] = clone(input[index]);
65+
output[index] = Public.clone(input[index]);
5866

5967
}
6068

6169
return output;
6270

71+
};
72+
73+
/**
74+
* Merge two objects recursively
75+
* @param mixed input
76+
* @param mixed extend
77+
* @return mixed
78+
*/
79+
80+
function merge_recursive(base, extend) {
81+
82+
if (typeOf(base) !== 'object')
83+
84+
return extend;
85+
86+
for (var key in extend) {
87+
88+
if (typeOf(base[key]) === 'object' && typeOf(extend[key]) === 'object') {
89+
90+
base[key] = merge_recursive(base[key], extend[key]);
91+
92+
} else {
93+
94+
base[key] = extend[key];
95+
96+
}
97+
98+
}
99+
100+
return base;
101+
63102
}
64103

104+
/**
105+
* Merge two or more objects
106+
* @param bool clone
107+
* @param bool recursive
108+
* @param array argv
109+
* @return object
110+
*/
111+
112+
function merge(clone, recursive, argv) {
113+
114+
var result = argv[0],
115+
size = argv.length;
116+
117+
if (clone || typeOf(result) !== 'object')
118+
119+
result = {};
120+
121+
for (var index=0;index<size;++index) {
122+
123+
var item = argv[index],
124+
125+
type = typeOf(item);
126+
127+
if (type !== 'object') continue;
128+
129+
for (var key in item) {
130+
131+
var sitem = clone ? Public.clone(item[key]) : item[key];
132+
133+
if (recursive) {
134+
135+
result[key] = merge_recursive(result[key], sitem);
136+
137+
} else {
138+
139+
result[key] = sitem;
140+
141+
}
142+
143+
}
144+
145+
}
146+
147+
return result;
148+
149+
}
150+
151+
/**
152+
* Get type of variable
153+
* @param mixed input
154+
* @return string
155+
*
156+
* @see http://jsperf.com/typeofvar
157+
*/
158+
65159
function typeOf(input) {
66160

67-
return ({}).toString.call(input).match(/\s([\w]+)/)[1].toLowerCase();
161+
return ({}).toString.call(input).slice(8, -1).toLowerCase();
68162

69163
}
70164

71165
if (isNode) {
72166

73-
module.exports = merge;
167+
module.exports = Public;
74168

75169
} else {
76170

77-
window.merge = merge;
171+
window[publicName] = Public;
78172

79173
}
80174

merge.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "merge",
3-
"version": "1.1.3",
3+
"version": "1.2.0",
44
"author": "yeikos (http://www.yeikos.com)",
55
"description": "Merge multiple objects into one, optionally creating a new cloned object. Similar to the jQuery.extend but more flexible. Works in Node.js and the browser.",
66
"main": "merge.js",
@@ -12,6 +12,7 @@
1212
},
1313
"keywords": [
1414
"merge",
15+
"recursive",
1516
"extend",
1617
"clone",
1718
"object",

tests/index.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
<head>
44

55
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6-
<title>JavaScript/NodeJS Merge v1.1.3</title>
6+
<title>JavaScript/NodeJS Merge v1.2.0</title>
77

88
<link rel="stylesheet" href="qunit/qunit.css" />
99

10-
<script src="qunit/qunit.js" data-qunit></script>
11-
<script src="../merge.js" data-qunit></script>
12-
<script src="tests.js" data-qunit></script>
10+
<script src="qunit/qunit.js"></script>
11+
<script src="../merge.js"></script>
12+
<script src="tests.js"></script>
1313

1414
</head>
1515

0 commit comments

Comments
 (0)