Skip to content

Commit 22eb308

Browse files
committed
Added U.clone().
1 parent 8900952 commit 22eb308

3 files changed

Lines changed: 68 additions & 7 deletions

File tree

changes.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
======= 1.9.6 (BETA)
22

33
- added: MailMessage.manually() and removes auto-sending mail --> works only with F.mail() and controller.Mail().
4+
- added: U.clone(obj, [skip])
45

56
- updated: F.mail() supports themes with view nema like this `=default/someview'`
67
- updated: @{import()} supports movies and images

test/test-utils.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -355,12 +355,13 @@ function other() {
355355

356356
assert.ok(JSON.stringify(utils.extend({ id: 1 })) === '{"id":1}', 'utils.extend() - undefined');
357357

358-
utils.copy(obj, { name: 'Peter', age: 25 });
358+
var anonymous = { name: 'Peter', age: 25, arr: [1, 2, 3] };
359359
assert.ok(!obj.name, 'utils.copy(2)');
360-
361360
assert.ok(utils.copy({ name: 'Janko' }).name === 'Janko', 'utils.copy(1)');
362361

363-
utils.extend(obj, { name: 'Peter', age: 25 });
362+
utils.extend(obj, anonymous);
363+
obj.arr.push(4);
364+
assert.ok(obj.arr.length !== anonymous.length, 'utils.copy(2)');
364365
assert.ok(obj.name === 'Peter' && obj.age === 25, 'utils.extend()');
365366

366367
utils.copy({ name: 'A', age: -1 }, obj);

utils.js

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,12 +1065,73 @@ exports.extend = function(target, source, rewrite) {
10651065
while (i--) {
10661066
var key = keys[i];
10671067
if (rewrite || target[key] === undefined)
1068-
target[key] = source[key];
1068+
target[key] = exports.clone(source[key]);
10691069
}
10701070

10711071
return target;
10721072
};
10731073

1074+
/**
1075+
* Clones object
1076+
* @param {Object} obj
1077+
* @param {Object} skip Optional, can be only object e.g. { name: true, age: true }.
1078+
* @param {Boolean} skipFunctions It doesn't clone functions, optional --> default false.
1079+
* @return {Object}
1080+
*/
1081+
exports.clone = function(obj, skip, skipFunctions) {
1082+
1083+
if (!obj)
1084+
return obj;
1085+
1086+
var type = typeof(obj);
1087+
1088+
if (type !== OBJECT)
1089+
return obj;
1090+
1091+
var length;
1092+
var o;
1093+
1094+
if (obj instanceof Array) {
1095+
1096+
length = obj.length;
1097+
o = new Array(length);
1098+
1099+
for (var i = 0; i < length; i++) {
1100+
type = typeof(obj[i]);
1101+
if (type !== OBJECT) {
1102+
if (skipFunctions && type === FUNCTION)
1103+
continue;
1104+
o[i] = obj[i];
1105+
continue;
1106+
}
1107+
o[i] = exports.clone(obj[i], skip, skipFunctions);
1108+
}
1109+
1110+
return o;
1111+
}
1112+
1113+
o = {};
1114+
1115+
for (var m in obj) {
1116+
1117+
if (skip && skip[m])
1118+
continue;
1119+
1120+
var val = obj[m];
1121+
var type = typeof(val);
1122+
if (type !== OBJECT) {
1123+
if (skipFunctions && type === FUNCTION)
1124+
continue;
1125+
o[m] = val;
1126+
continue;
1127+
}
1128+
1129+
o[m] = exports.clone(obj[m], skip, skipFunctions);
1130+
}
1131+
1132+
return o;
1133+
}
1134+
10741135
/**
10751136
* Copy values from object to object
10761137
* @param {Object} source Object source
@@ -1092,12 +1153,10 @@ exports.copy = function(source, target) {
10921153
var i = keys.length;
10931154

10941155
while (i--) {
1095-
10961156
var key = keys[i];
10971157
if (target[key] === undefined)
10981158
continue;
1099-
1100-
target[key] = source[key];
1159+
target[key] = exports.clone(source[key]);
11011160
}
11021161

11031162
return target;

0 commit comments

Comments
 (0)