| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- export default function extend() {
- let options,
- name,
- src,
- copy,
- copyIsArray,
- clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
- // Handle a deep copy situation
- if (typeof target === "boolean") {
- deep = target;
- // Skip the boolean and the target
- target = arguments[i] || {};
- i++;
- }
- // Handle case when target is a string or something (possible in deep copy)
- if (typeof target !== "object" && typeof target !== "function") {
- target = {};
- }
- for (; i < length; i++) {
- // Only deal with non-null/undefined values
- if ((options = arguments[i]) != null) {
- // Extend the base object
- for (name in options) {
- src = target[name];
- copy = options[name];
- // Prevent never-ending loop
- if (target === copy) {
- continue;
- }
- // Recurse if we're merging plain objects or arrays
- if (
- deep &&
- copy &&
- (Object.prototype.toString.call(copy) === "[object Object]" ||
- (copyIsArray = Array.isArray(copy)))
- ) {
- if (copyIsArray) {
- copyIsArray = false;
- clone = src && Array.isArray(src) ? src : [];
- } else {
- clone =
- src && Object.prototype.toString.call(src) === "[object Object]"
- ? src
- : {};
- }
- // Never move original objects, clone them
- target[name] = extend(deep, clone, copy);
- // Don't bring in undefined values
- } else if (copy !== undefined) {
- target[name] = copy;
- }
- }
- }
- }
- // Return the modified object
- return target;
- }
|