Skip to content

Instantly share code, notes, and snippets.

@agrublev
Created March 18, 2020 04:52
Show Gist options
  • Select an option

  • Save agrublev/d498c772706e53bae7f7364d45f54472 to your computer and use it in GitHub Desktop.

Select an option

Save agrublev/d498c772706e53bae7f7364d45f54472 to your computer and use it in GitHub Desktop.

Revisions

  1. agrublev created this gist Mar 18, 2020.
    43 changes: 43 additions & 0 deletions extend.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,43 @@
    const uniqueElements = arr => [...new Set(arr)];

    const getType = v =>
    v === undefined
    ? "undefined"
    : v === null
    ? "null"
    : v.constructor.name.toLowerCase();

    const extendObject = (obj, obj2) => {
    for (let key in obj) {
    let item = obj[key];
    let typeIs = getType(item);
    let typeIs2 = getType(obj2[key]);
    if (typeIs !== "object") {
    if (typeIs === "array" && typeIs2 === "array") {
    obj[key] = uniqueElements([...obj[key], ...obj2[key]]);
    } else if (typeIs2 !== "array") {
    obj[key] = obj2[key];
    } else {
    obj[key] = { ...obj[key], ...obj2[key] };
    }
    } else if (typeIs2 === "object" && typeIs === "object") {
    extendObject(obj[key], obj2[key]);
    }
    }
    for (let key in obj2) {
    let item = obj2[key];
    let typeIs = getType(item);
    let typeIs2 = getType(obj[key]);
    if (typeIs !== "object") {
    if (typeIs === "array" && typeIs2 === "undefined") {
    obj[key] = item;
    } else if (typeIs2 === "undefined") {
    obj[key] = obj2[key];
    }
    } else if (typeIs2 === "object" && typeIs === "object") {
    extendObject(obj[key], obj2[key]);
    }
    }
    };

    module.exports = extendObject;