Toggle navigation
MeasureThat
.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
Lodash cloneDeep vs for loop vs JSON parse vs recursive clone deep vs recursive reduce clone deep
compare object deep copy/clone methods
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (iPhone; CPU iPhone OS 17_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Mobile/15E148 Safari/604.1
Browser:
Mobile Safari 17
Operating system:
iOS 17.6.1
Device Platform:
Mobile
Date tested:
one year ago
Recursive clone deep
2.0M/s
JSON parse
1.8M/s
Lodash cloneDeep
1.0M/s
For loop
876K/s
Recursive reduce clone deep
644K/s
View exact numbers
Test name
Executions per second
✓
Recursive clone deep
2,015,896 Ops/sec
JSON parse
1,817,513 Ops/sec
Lodash cloneDeep
1,042,423 Ops/sec
For loop
876,319 Ops/sec
Recursive reduce clone deep
643,540 Ops/sec
HTML Preparation code:
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js'></script>
Script Preparation code:
var obj = {a: "hello", c: "test", num: 3, arr: [1, 2, 3, 4], anotherObj: {a: 35, str: "tester"}}; var deepClone = function(obj) { var out = null; if (Array.isArray(obj)) { out = []; for (var index = 0; index < obj.length; ++index) { var subArray = obj[index]; out.push((typeof subArray === 'object') ? deepClone(subArray) : subArray); } } else { out = {}; for (var key in obj) { var subObject = obj[key]; out[key] = (typeof subObject === 'object') ? deepClone(subObject) : subObject; } } return out; }; function cloneArray(value) { var newArray; if (value && value.length) { newArray = []; for (var i = 0; i < value.length; i++) { if (typeof value[i] === 'object') { newArray[i] = Array.isArray(value[i]) ? cloneArray(value[i]) : cloneObject(value[i]); } else { newArray[i] = value[i]; } } } else if (value === null) { newArray = null; } return newArray; } function cloneObject(value) { var newObject; if (value && typeof value === 'object' && Object.keys(value).length > 0) { newObject = {}; for (var key in value) { if (typeof value[key] === 'object') { newObject[key] = Array.isArray(value) ? cloneArray(value[key]) : cloneObject(value[key]); } else { newObject[key] = value[key]; } } } else if (value && typeof value === 'object' && Object.keys(value).length === 0) { newObject = {}; } else if (value === null) { newObject = null; } return newObject; } function reduceDeepClone(obj) { return Object.keys(obj).reduce((v, d) => Object.assign(v, { [d]: (obj[d].constructor === Object) ? reduceDeepClone(obj[d]) : obj[d] }), {}); }
Tests:
Lodash cloneDeep
testCopy = _.cloneDeep(obj);
JSON parse
testCopy = JSON.parse(JSON.stringify(obj));
For loop
testCopy = cloneObject(obj);
Recursive clone deep
testCopy = deepClone(obj);
Recursive reduce clone deep
testCopy = reduceDeepClone(obj);