all files / lib/ helpers.js

87.5% Statements 28/32
81.48% Branches 22/27
100% Functions 2/2
87.1% Lines 27/31
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79                  143× 159× 159×     155×       143×                         159× 141×   159× 141×     159×         159× 90×       69×             69× 51× 51× 18×   51×     18× 18× 18× 90×   18×            
/**
 * Merge
 *
 * Just a simple little object merge. Overrides objectA with objectB
 *
 * @param {Object} objectA - Starting object
 * @param {Object} objectB - Object who's keys override objectA's
 * @returns {{}}
 */
function merge(objectA, objectB) {
    for (var attrName in objectB) {
        Eif(objectB.hasOwnProperty(attrName)) {
            if (objectA.hasOwnProperty(attrName) && objectA[attrName] instanceof Object && objectB.hasOwnProperty(attrName) && objectB[attrName] instanceof Object) {
                objectA[attrName] = merge(objectA[attrName], objectB[attrName]);
            }
            else {
                objectA[attrName] = objectB[attrName];
            }
        }
    }
    return objectA;
}
 
/**
 * Deep Copy
 *
 * Creates a new object, copying the variables one by one into it.
 * Available as a GitHub Gist: https://gist.github.com/four43/f93647e8feaa54713cfe
 * @param {Object|Array} input The input object or array to copy.
 * @param {Number} [maxDepth] The max depth the function should recurse before passing by reference, default: 5
 * @param {Number} [depth] Starts at 0, used by recursion
 * @returns {Object|Array}
 */
function deepCopy(input, maxDepth, depth) {
    if (maxDepth === undefined) {
        maxDepth = 5;
    }
    if (depth === undefined) {
        depth = 0;
    }
 
    Iif(depth > maxDepth) {
        return null;
    }
 
    // Handle the 3 simple types, and null or undefined
    if (input === null || input === undefined || typeof input !== "object") {
        return input;
    }
 
    // Date
    Iif (input instanceof Date) {
        var dateCopy = new Date();
        dateCopy.setTime(input.getTime());
        return dateCopy;
    }
 
    // Array
    if (input instanceof Array) {
        var arrayCopy = [];
        for (var i = 0, len = input.length; i < len; i++) {
            arrayCopy[i] = this.deepCopy(input[i], maxDepth, depth + 1);
        }
        return arrayCopy;
    }
    // Object
    Eif (input instanceof Object) {
        var newObj = {};
        for (var prop in input) {
            Eif (input.hasOwnProperty(prop)) newObj[prop] = this.deepCopy(input[prop]);
        }
        return newObj;
    }
}
 
module.exports = {
    deepCopy: deepCopy,
    merge: merge
};