deepextend.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import {$set} from './modify';
  2. import is from './type';
  3. export default function deepExtend(origin, target = {}, mode) {
  4. let isArr = false;
  5. for (let key in target) {
  6. if (Object.prototype.hasOwnProperty.call(target, key)) {
  7. let clone = target[key];
  8. if ((isArr = Array.isArray(clone)) || is.Object(clone)) {
  9. let nst = origin[key] === undefined;
  10. if (isArr) {
  11. isArr = false;
  12. nst && $set(origin, key, []);
  13. } else if (clone._clone && mode !== undefined) {
  14. if (mode) {
  15. clone = clone.getRule();
  16. nst && $set(origin, key, {});
  17. } else {
  18. $set(origin, key, clone._clone());
  19. continue;
  20. }
  21. } else {
  22. nst && $set(origin, key, {});
  23. }
  24. origin[key] = deepExtend(origin[key], clone, mode);
  25. } else {
  26. $set(origin, key, clone);
  27. if (!is.Undef(clone)) {
  28. if (!is.Undef(clone.__json)) {
  29. origin[key].__json = clone.__json;
  30. }
  31. if (!is.Undef(clone.__origin)) {
  32. origin[key].__origin = clone.__origin;
  33. }
  34. }
  35. }
  36. }
  37. }
  38. return (mode !== undefined && Array.isArray(origin)) ? origin.filter(v => !v || !v.__ctrl) : origin
  39. }
  40. export function deepCopy(value) {
  41. return deepExtend({}, {value}).value;
  42. }
  43. export function deepExtendArgs(origin, ...lst) {
  44. lst.forEach(target => {
  45. origin = deepExtend(origin, target);
  46. });
  47. return origin;
  48. }