HTML Preparation code:
AخA
 
1
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js'></script>
Script Preparation code:
x
 
function jsMerge(target, ...sources) {
    if (!sources.length) {
        return target;
    }
    sources.forEach((src) => {
        Object.keys(src).forEach((key) => {
            const value = src[key];
            if (Object.prototype.hasOwnProperty.call(target, key)) {
                // target already has key. Merge if required.
                if (typeof target[key] === 'object' && typeof value === 'object') {
                    // Try to merge objects or arrays
                    if (Array.isArray(value)) {
                        if (Array.isArray(target[key]) && target[key].length > value.length) {
                            // Both arrays and old array is longer. Merge
                            target[key] = Array.prototype.concat(value, Array.prototype.slice.call(target[key], value.length));
                        } else {
                            // Either not both arrays or old array is same length/shorter. Overwrite.
                            target[key] = value;
                        }
                    } else {
                        // Both non-array objects. Recursively merge
                        target[key] = jsMerge(target[key], value);
                    }
                } else {
                    // At least one side is not object/array. Overwrite.
                    target[key] = value;
                }
            } else {
                // Key does not exist on object. Assign.
                target[key] = value;
            }
        });
    });
    return target;
}
Tests:
  • recursive indexed setter merge function

     
    var a1 = { a: 'oh', b: 'my', c: 'goodness', d: { a: 'nested', b: 'object', c: [ 'arrayA', 'arrayB', 'arrayC' ], e: 'a.d.e' } };
    var b1 = { c: 'GOODNESS', d: { b: 'object!', c: [ 'array1', 'array2' ], d: 'b.d.d' } };
    jsMerge(a1, b1);
  • lodash merge

     
    var a2 = { a: 'oh', b: 'my', c: 'goodness', d: { a: 'nested', b: 'object', c: [ 'arrayA', 'arrayB', 'arrayC' ], e: 'a.d.e' } };
    var b2 = { c: 'GOODNESS', d: { b: 'object!', c: [ 'array1', 'array2' ], d: 'b.d.d' } };
    _.merge(a2, b2);
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    recursive indexed setter merge function
    lodash merge

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 7 months ago)
Mozilla/5.0 (Android 14; Mobile; rv:131.0) Gecko/131.0 Firefox/131.0
Firefox Mobile 131 on Android
View result in a separate tab
Test name Executions per second
recursive indexed setter merge function 1089465.5 Ops/sec
lodash merge 319668.3 Ops/sec