HTML Preparation code:
x
 
1
2
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js'></script>
Script Preparation code:
 
var testArray = [{
  description: 'Random description.',
  testNumber: 123456789,
  testBoolean: true,
  testObject: {
    testString: 'test string',
    testNumber: 12345
  },
  testArray: [{
    myName: 'test name',
    myNumber: 123245
  }]
},{
  description: 'Random description.',
  testNumber: 123456789,
  testBoolean: true,
  testObject: {
    testString: 'test string',
    testNumber: 12345
  },
  testArray: [{
    myName: 'test name',
    myNumber: 123245
  }]
}];
var testCopy = null;
var deepClone = function(obj) {
   var out;
    if (Array.isArray(obj)) {
        out = [];
        for (var index = 0; index < obj.length; ++index) {
            let subArray = obj[index];
            out.push((subArray === null) ? subArray : (subArray instanceof Date) ? new Date(subArray.valueOf()) : (typeof subArray === 'object') ? deepClone(subArray) : subArray);
        }
    } else {
        out = {};
        for (var key in obj) {
            var subObject = obj[key];
            out[key] = subObject === null ? subObject : subObject instanceof Date ? new Date(subObject.valueOf()) : (typeof subObject === 'object') ? deepClone(subObject) : subObject;
            
           
        }
    }
    return out;
};
Tests:
  • Lodash cloneDeep

     
    testCopy =  _.cloneDeep(testArray);
  • Native map deep slice(turns objects into arrays)

     
    testCopy = testArray.map(arr => testArray.slice());
  • Native JSON parse

     
    testCopy = JSON.parse(JSON.stringify(testArray));
  • Native map deep slice at 0(turns objects into arrays)

     
    testCopy = testArray.map(arr => testArray.slice(0));
  • Native map(shallow clone)

     
    testCopy = testArray.map(arr => arr);
  • Recursive deep clone

     
    testCopy = deepClone(testArray);
  • Map deep clone

     
    testCopy = testArray.map(arr => deepClone(arr));
  • Object.assign shallow clone

     
    testCopy = Object.assign([...testArray]);
  • structuredClone

     
    testCopy = structuredClone(testArray);
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Lodash cloneDeep
    Native map deep slice(turns objects into arrays)
    Native JSON parse
    Native map deep slice at 0(turns objects into arrays)
    Native map(shallow clone)
    Recursive deep clone
    Map deep clone
    Object.assign shallow clone
    structuredClone

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 6 hours ago)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Chrome 133 on Windows
View result in a separate tab
Test name Executions per second
Lodash cloneDeep 358790.6 Ops/sec
Native map deep slice(turns objects into arrays) 8343281.5 Ops/sec
Native JSON parse 542964.2 Ops/sec
Native map deep slice at 0(turns objects into arrays) 8317737.5 Ops/sec
Native map(shallow clone) 9308361.0 Ops/sec
Recursive deep clone 2167404.0 Ops/sec
Map deep clone 2272635.2 Ops/sec
Object.assign shallow clone 8479168.0 Ops/sec
structuredClone 236132.2 Ops/sec