deepmerge comparisions

Benchmark created by Enzo on


Setup

var deepExtend = function (/*obj_1, [obj_2], [obj_N]*/) {
      if (arguments.length < 1 || typeof arguments[0] !== 'object') {
        return false;
      }
    
      if (arguments.length < 2) return arguments[0];
    
      var target = arguments[0];
    
      // convert arguments to array and cut off target object
      var args = Array.prototype.slice.call(arguments, 1);
    
      var key, val, src, clone, tmpBuf;
    
      args.forEach(function (obj) {
        if (typeof obj !== 'object') return;
    
        for (key in obj) {
          if ( ! (key in obj)) continue;
    
          src = target[key];
          val = obj[key];
    
          if (val === target) continue;
    
          if (typeof val !== 'object' || val === null) {
            target[key] = val;
            continue;
          } else if (val instanceof Date) {
            target[key] = new Date(val.getTime());
            continue;
          } else if (val instanceof RegExp) {
            target[key] = new RegExp(val);
            continue;
          }
    
          if (typeof src !== 'object' || src === null) {
            clone = (Array.isArray(val)) ? [] : {};
            target[key] = deepExtend(clone, val);
            continue;
          }
    
          if (Array.isArray(val)) {
            clone = (Array.isArray(src)) ? src : [];
          } else {
            clone = (!Array.isArray(src)) ? src : {};
          }
    
          target[key] = deepExtend(clone, val);
        }
      });
    
      return target;
    }
    
    
    
    
    function deepmerge(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 dst[i] === 'undefined') {
                    dst[i] = e;
                } else if (typeof e === 'object') {
                    dst[i] = deepmerge(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] = deepmerge(target[key], src[key]);
                    }
                }
            });
        }
    
        return dst;
    }
    
    
    
    
    var deepExtend2 = function() {
    
        if (arguments.length < 1 || typeof arguments[0] !== 'object')
            return false;
    
        if (arguments.length < 2) return arguments[0];
    
    
        var target = arguments[0],
            args = Array.prototype.slice.call(arguments, 1),
            key, val, src, clone;
    
        var obj = arguments[1];
    
    
        for (key in obj) {
    
            if (!(key in obj)) continue;
    
            src = target[key];
            val = obj[key];
    
            if (val === target) continue;
    
            if (typeof val !== 'object' && !Array.isArray(val)) {
                target[key] = val;
                continue;
            }
    
    
            if (typeof src !== 'object' || src === null) {
                clone = (Array.isArray(val)) ? [] : {};
                target[key] = deepExtend2(clone, val);
                continue;
            }
    
    
            clone = (Array.isArray(val)) ?
    
                (Array.isArray(src)) ? src : []
            :
                (!Array.isArray(src)) ? src : {};
    
    
    
            target[key] = deepExtend2(clone, val);
        }
    
        return target;
    };

Test runner

Ready to run.

Testing in
TestOps/sec
deepExtend
var obj1 = {
    a: 11,
    b: 12,
    d: {
        d1: 13,
        d2: {
            d21: 123,
            d22: {
                d221: 12,
                d223: { 
                  hola: 'hola',
                  static: 'static'
                }
            }
        }
    },
    f: 5,
    g: 123
};
var obj2 = {
    b: 3,
    c: 5,
    d: {
        d2: {
            d22: {
                d222: 25,
                d223: {
                  hola:'mundo'
                }
            }
        }
    },

};


deepExtend(obj1, obj2);
ready
deepmerge
var obj1 = {
    a: 11,
    b: 12,
    d: {
        d1: 13,
        d2: {
            d21: 123,
            d22: {
                d221: 12,
                d223: { 
                  hola: 'hola',
                  static: 'static'
                }
            }
        }
    },
    f: 5,
    g: 123
};
var obj2 = {
    b: 3,
    c: 5,
    d: {
        d2: {
            d22: {
                d222: 25,
                d223: {
                  hola:'mundo'
                }
            }
        }
    },

};

deepmerge(obj1, obj2);
ready
deepExtend2
var obj1 = {
    a: 11,
    b: 12,
    d: {
        d1: 13,
        d2: {
            d21: 123,
            d22: {
                d221: 12,
                d223: { 
                  hola: 'hola',
                  static: 'static'
                }
            }
        }
    },
    f: 5,
    g: 123
};
var obj2 = {
    b: 3,
    c: 5,
    d: {
        d2: {
            d22: {
                d222: 25,
                d223: {
                  hola:'mundo'
                }
            }
        }
    },

};


deepExtend2(obj1, obj2);
ready

Revisions

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