Deep Object Merging (v13)

Revision 13 of this benchmark created on


Preparation HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://cdn.sencha.com/ext/gpl/4.2.0/ext-all.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.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.