You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.1 KiB
45 lines
1.1 KiB
3 years ago
|
import { isPlainObject } from "./isPlainObject.js";
|
||
|
|
||
|
/**
|
||
|
* Merge the contents of two or more objects together into the first object.
|
||
|
* If passing "true" for first argument, the merge becomes recursive (aka. deep copy).
|
||
|
* @param {...any} args
|
||
|
* @returns {Object}
|
||
|
*/
|
||
|
export const extend = (...args) => {
|
||
|
let deep = false;
|
||
|
|
||
|
if (typeof args[0] == "boolean") {
|
||
|
deep = args.shift();
|
||
|
}
|
||
|
|
||
|
let result = args[0];
|
||
|
|
||
|
if (!result || typeof result !== "object") {
|
||
|
throw new Error("extendee must be an object");
|
||
|
}
|
||
|
|
||
|
const extenders = args.slice(1);
|
||
|
const len = extenders.length;
|
||
|
|
||
|
for (let i = 0; i < len; i++) {
|
||
|
const extender = extenders[i];
|
||
|
|
||
|
for (let key in extender) {
|
||
|
if (extender.hasOwnProperty(key)) {
|
||
|
const value = extender[key];
|
||
|
|
||
|
if (deep && (Array.isArray(value) || isPlainObject(value))) {
|
||
|
const base = Array.isArray(value) ? [] : {};
|
||
|
|
||
|
result[key] = extend(true, result.hasOwnProperty(key) ? result[key] : base, value);
|
||
|
} else {
|
||
|
result[key] = value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
};
|