Deep Object Merging (v11)

Revision 11 of this benchmark created on


Preparation HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://docs.sencha.com/ext-js/4-1/extjs/ext-all.js"></script>
<script src="http://raw.githubusercontent.com/lodash/lodash/master/dist/lodash.min.js"></script>

Setup

var extjs = {
        companyName: 'Ext JS',
        products: ['Ext JS', 'Ext GWT', 'Ext Designer'],
        isSuperCool: true,
        office: {
            size: 2000,
            location: 'Palo Alto',
            isFun: true
        }
    };
    
    var newStuff = {
        companyName: 'Sencha Inc.',
        products: ['Ext JS', 'Ext GWT', 'Ext Designer', 'Sencha Touch', 'Sencha Animator'],
        office: {
            size: 40000,
            location: 'Redwood City'
        }
    };
    
    
    var merge = function(target, src) {
        var array = Array.isArray(src)
        var dst = array && [] || {}
    
        if (array) {
            target = target || []
            dst = dst.concat(target)
            src.forEach(function(e, i) {
                if (typeof e === 'object') {
                    dst[i] = merge(target[i], e)
                } else {
                    if (target.indexOf(e) === -1) {
                        dst.push(e)
                    }
                }
            })
        } else {
            if (target && typeof target === 'object') {
                Object.keys(target).forEach(function (key) {
                    dst[key] = target[key]
                })
            }
            Object.keys(src).forEach(function (key) {
                if (typeof src[key] !== 'object' || !src[key]) {
                    dst[key] = src[key]
                }
                else {
                    if (!target[key]) {
                        dst[key] = src[key]
                    } else {
                        dst[key] = merge(target[key], src[key])
                    }
                }
            })
        }
    
        return dst
    }
    
    
    var extmerge = function(destination) {
        var i = 1,
            ln = arguments.length,
            mergeFn = extmerge,
            object, key, value, sourceKey;
    
        for (; i < ln; i++) {
            object = arguments[i];
    
            for (key in object) {
                value = object[key];
                if (value && value.constructor === Object) {
                    sourceKey = destination[key];
                    mergeFn(sourceKey, value);
                }
                else {
                    destination[key] = value;
                }
            }
        }
    
        return destination;
    };

Test runner

Ready to run.

Testing in
TestOps/sec
ExtJS
Ext.merge(extjs, newStuff);
ready
LoDash
_.merge(extjs, newStuff);
ready
jQuery
$.extend(true, extjs, newStuff);
ready
deepmerge
merge(extjs, newStuff);
ready
extmerge2
extmerge(extjs,newStuff);
ready

Revisions

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