58 lines
1.0 KiB
JavaScript
58 lines
1.0 KiB
JavaScript
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var type;
|
|
try {
|
|
type = require('component-type');
|
|
} catch (_) {
|
|
type = require('type');
|
|
}
|
|
|
|
/**
|
|
* Module exports.
|
|
*/
|
|
|
|
module.exports = clone;
|
|
|
|
/**
|
|
* Clones objects.
|
|
*
|
|
* @param {Mixed} any object
|
|
* @api public
|
|
*/
|
|
|
|
function clone(obj){
|
|
switch (type(obj)) {
|
|
case 'object':
|
|
var copy = {};
|
|
for (var key in obj) {
|
|
if (obj.hasOwnProperty(key)) {
|
|
copy[key] = clone(obj[key]);
|
|
}
|
|
}
|
|
return copy;
|
|
|
|
case 'array':
|
|
var copy = new Array(obj.length);
|
|
for (var i = 0, l = obj.length; i < l; i++) {
|
|
copy[i] = clone(obj[i]);
|
|
}
|
|
return copy;
|
|
|
|
case 'regexp':
|
|
// from millermedeiros/amd-utils - MIT
|
|
var flags = '';
|
|
flags += obj.multiline ? 'm' : '';
|
|
flags += obj.global ? 'g' : '';
|
|
flags += obj.ignoreCase ? 'i' : '';
|
|
return new RegExp(obj.source, flags);
|
|
|
|
case 'date':
|
|
return new Date(obj.getTime());
|
|
|
|
default: // string, number, boolean, …
|
|
return obj;
|
|
}
|
|
}
|