Skip to content

Instantly share code, notes, and snippets.

@agrublev
Created March 18, 2020 04:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agrublev/d498c772706e53bae7f7364d45f54472 to your computer and use it in GitHub Desktop.
Save agrublev/d498c772706e53bae7f7364d45f54472 to your computer and use it in GitHub Desktop.
Extend Object Fully
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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment