Clone an object (v4)

Revision 4 of this benchmark created on


Description

Recursive vs Iterative

Setup

function clone_recursive(object) {
        var result = {};
        for (var key in object) {
            var value = object[key];
            if (typeof value === 'object') {
                result[key] = clone_recursive(value);
            } else {
                result[key] = value;
            }
        }
        return result;
    }
    
    function clone_iterative(object) {
        var result = {};
        var queue = [{base: result, value: object}];
        var item;
        while (item = queue.shift()) {
            var current = item.value;
            var base = item.base;
            for (var key in current) {
                var value = current[key];
                if (typeof value === 'object') {
                    var resultValue = base[key] = {};
                    queue.push({base: resultValue, value: value});
                } else {
                    base[key] = value;
                }
            }
        }
        return result;
    }
    
    function clone_iterative_linked_list(object) {
        var result = {};
        var queueHead = {base: result, value: object, next: null};
        var queueTail = queueHead;
    
        for(;queueHead; queueHead = queueHead.next){
            var item = queueHead;
    
            var current = item.value;
            var base = item.base;
            for (var key in current) {
                var value = current[key];
                if (typeof value === 'object') {
                    var resultValue = base[key] = {};
                    queueTail.next = {base: resultValue, value: value, next:null};
                    queueTail = queueTail.next;
                } else {
                    base[key] = value;
                }
            }
        }
        return result;
    }
    
    function makeDeepObject() {
        var root = {};
        var current = root;
        for (var i = 33, max = 136; i < max; i++) {
            var key = String.fromCharCode(i);
            var newObject = {};
            for (var j = 0; j < 25; j++) {
                newObject['a' + j] = {x: 1};
            }
            current[key] = newObject;
            for (; j < 50; j++) {
                newObject['z' + j] = {y: 2};
            }
            current = newObject;
        }
        return root;
    }
    
    var mock = makeDeepObject();

Test runner

Ready to run.

Testing in
TestOps/sec
Recursive
clone_recursive(mock)
ready
Iterative
clone_iterative(mock)
ready
linked list
clone_iterative_linked_list(mock)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.