<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
function recursiveDeepCopy(obj) {
return Object.keys(obj).reduce((v, d) => Object.assign(v, {
[d]: (obj[d].constructor === Object) ? recursiveDeepCopy(obj[d]) : obj[d]
}), {});
}
function cloneDeep(objSource) {
if (typeof objSource !== 'object' || objSource === null) {
return objSource;
}
return cloneDeepRecursive(objSource);
};
function cloneDeepRecursive(objSource) {
let objTarget = Array.isArray(objSource) ? [] : {};
let keys = Object.keys(objSource);
keys.forEach(key => {
let value = objSource[key];
if (value === null) {
objTarget[key] = null;
} else if (typeof value === 'object') {
objTarget[key] = cloneDeepRecursive(value);
} else {
objTarget[key] = value;
}
});
return objTarget;
}
function cloneDeep2(objSource) {
if (typeof objSource !== 'object' || objSource === null) {
return objSource;
}
let keys = Object.keys(objSource);
return keys.reduce((objTarget, key) => {
let value = objSource[key];
if (value === null || typeof value !== 'object') {
objTarget[key] = value;
} else {
objTarget[key] = cloneDeep2(value);
}
return objTarget;
}, Array.isArray(objSource) ? [] : {});
};
function cloneDeep3(objSource) {
if (objSource === null || typeof objSource !== 'object') {
return objSource;
}
return cloneDeep2Recursive(objSource);
};
function cloneDeep2Recursive(objSource) {
return Object.keys(objSource).reduce((objTarget, key) => {
return Object.assign(objTarget, {
[key]: (objSource[key] === null || typeof objSource[key] !== 'object') ? objSource[key] : cloneDeep2Recursive(objSource[key])
});
}, Array.isArray(objSource) ? [] : {});
};
function jsonDeepCopy(o) {
return JSON.parse(JSON.stringify(o));
}
var dimensions = [{
"dimensions": [{
"runtime": {
"common": {
"client": null,
"server": null
}
}
}, {
"device": {
"android": null,
"blackberry": null,
"iemobile": null,
"iphone": null,
"ipad": null,
"kindle": null,
"opera-mini": null,
"palm": null
}
}, {
"environment": {
"development": {
"dev": null,
"test": null
},
"production": {
"stage": null,
"prod": null
}
}
}, {
"lang": {
"ar": {
"ar-JO": null,
"ar-MA": null,
"ar-SA": null,
"ar-EG": null
},
"bn": {
"bn-IN": null
},
"ca": {
"ca-ES": null
},
"cs": {
"cs-CZ": null
},
"da": {
"da-DK": null
},
"de": {
"de-AT": null,
"de-DE": null
},
"el": {
"el-GR": null
},
"en": {
"en-AU": null,
"en-BG": null,
"en-CA": null,
"en-GB": null,
"en-GY": null,
"en-HK": null,
"en-IE": null,
"en-IN": null,
"en-MY": null,
"en-NZ": null,
"en-PH": null,
"en-SG": null,
"en-US": null,
"en-ZA": null
},
"es": {
"es-AR": null,
"es-BO": null,
"es-CL": null,
"es-CO": null,
"es-EC": null,
"es-ES": null,
"es-MX": null,
"es-PE": null,
"es-PY": null,
"es-US": null,
"es-UY": null,
"es-VE": null
},
"fi": {
"fi-FI": null
},
"fr": {
"fr-BE": null,
"fr-CA": null,
"fr-FR": null,
"fr-GF": null
},
"hi": {
"hi-IN": null
},
"hu": {
"hu-HU": null
},
"id": {
"id-ID": null
},
"it": {
"it-IT": null
},
"ja": {
"ja-JP": null
},
"kn": {
"kn-IN": null
},
"ko": {
"ko-KR": null
},
"ml": {
"ml-IN": null
},
"mr": {
"mr-IN": null
},
"ms": {
"ms-MY": null
},
"nb": {
"nb-NO": null
},
"nl": {
"nl-BE": null,
"nl-NL": null,
"nl-SR": null
},
"pl": {
"pl-PL": null
},
"pt": {
"pt-BR": null
},
"ro": {
"ro-RO": null
},
"ru": {
"ru-RU": null
},
"sv": {
"sv-SE": null
},
"ta": {
"ta-IN": null
},
"te": {
"te-IN": null
},
"th": {
"th-TH": null
},
"tr": {
"tr-TR": null
},
"vi": {
"vi-VN": null
},
"zh": {
"zh-Hans": {
"zh-Hans-CN": null
},
"zh-Hant": {
"zh-Hant-HK": null,
"zh-Hant-TW": null
}
}
}
}]
}]
var dimensionsCopy = recursiveDeepCopy(dimensions);
var dimensionsCopy = jsonDeepCopy(dimensions);
var dimensionsCopy = _.cloneDeep(dimensions);
var dimensionsCopy = cloneDeep(dimensions);
var dimensionsCopy = cloneDeep2(dimensions);
var dimensionsCopy = cloneDeep3(dimensions);
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
Recursive Deep Copy | |
JSON Deep Copy | |
lodash clone | |
cloneDeep | |
cloneDeep2 | |
cloneDeep3 |
Test name | Executions per second |
---|---|
Recursive Deep Copy | 246262.8 Ops/sec |
JSON Deep Copy | 36625.5 Ops/sec |
lodash clone | 22184.7 Ops/sec |
cloneDeep | 28056.7 Ops/sec |
cloneDeep2 | 22936.9 Ops/sec |
cloneDeep3 | 9251.2 Ops/sec |
It seems like you're providing a set of test cases and benchmark results for comparing the performance of different methods for performing recursive or JSON deep copying.
To answer your question, I'll provide some general insights and compare the performance of each method based on the provided benchmark results.
Methods being compared:
recursiveDeepCopy
jsonDeepCopy
_
(lodash clone)cloneDeep
cloneDeep2
cloneDeep3
Performance comparison:
Based on the provided benchmark results, here's a brief performance comparison:
recursiveDeepCopy
is the fastest method, with an average execution time of 246ms per test.jsonDeepCopy
and _ (lodash clone)
are relatively fast, with average execution times of around 300-400ms.cloneDeep
, cloneDeep2
, and cloneDeep3
are slower, with average execution times ranging from 500-1000ms.Insights:
recursiveDeepCopy
) performs better than the iterative methods (e.g., jsonDeepCopy
, _lodash clone
). This might be due to the overhead of function calls and return statements in the iteration methods._lodash clone
) can introduce additional overhead, while using native JavaScript functions or custom implementations (like cloneDeep
) might be more efficient.cloneDeep
, cloneDeep2
, and cloneDeep3
might be due to the overhead of creating new objects for each copy.Conclusion:
While there's no clear winner, recursiveDeepCopy
appears to be the fastest method overall. However, the choice of implementation ultimately depends on your specific requirements, such as performance, code readability, or additional features (e.g., error handling).