deep-assign.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.deepAssign = void 0;
  4. var MAX_MIX_LEVEL = 5; // 最大比对层级
  5. var toString = {}.toString;
  6. // 类型检测
  7. var isType = function (value, type) { return toString.call(value) === '[object ' + type + ']'; };
  8. var isArray = function (value) {
  9. return isType(value, 'Array');
  10. };
  11. var isObjectLike = function (value) {
  12. /**
  13. * isObjectLike({}) => true
  14. * isObjectLike([1, 2, 3]) => true
  15. * isObjectLike(Function) => false
  16. */
  17. return typeof value === 'object' && value !== null;
  18. };
  19. var isPlainObject = function (value) {
  20. /**
  21. * isObjectLike(new Foo) => false
  22. * isObjectLike([1, 2, 3]) => false
  23. * isObjectLike({ x: 0, y: 0 }) => true
  24. */
  25. if (!isObjectLike(value) || !isType(value, 'Object')) {
  26. return false;
  27. }
  28. var proto = value;
  29. while (Object.getPrototypeOf(proto) !== null) {
  30. proto = Object.getPrototypeOf(proto);
  31. }
  32. return Object.getPrototypeOf(value) === proto;
  33. };
  34. /***
  35. * @param {any} dist
  36. * @param {any} src
  37. * @param {number} level 当前层级
  38. * @param {number} maxLevel 最大层级
  39. */
  40. var deep = function (dist, src, level, maxLevel) {
  41. level = level || 0;
  42. maxLevel = maxLevel || MAX_MIX_LEVEL;
  43. for (var key in src) {
  44. if (Object.prototype.hasOwnProperty.call(src, key)) {
  45. var value = src[key];
  46. if (!value) {
  47. // null 、 undefined 等情况直接赋值
  48. dist[key] = value;
  49. }
  50. else {
  51. if (isPlainObject(value)) {
  52. if (!isPlainObject(dist[key])) {
  53. dist[key] = {};
  54. }
  55. if (level < maxLevel) {
  56. deep(dist[key], value, level + 1, maxLevel);
  57. }
  58. else {
  59. // 层级过深直接赋值,性能问题
  60. dist[key] = src[key];
  61. }
  62. }
  63. else if (isArray(value)) {
  64. dist[key] = [];
  65. dist[key] = dist[key].concat(value);
  66. }
  67. else {
  68. dist[key] = value;
  69. }
  70. }
  71. }
  72. }
  73. };
  74. /**
  75. * deepAssign 功能类似 deepMix
  76. * 不同点在于 deepAssign 会将 null undefined 等类型直接覆盖给 source
  77. * 详细参考: __tests__/unit/utils/deep-assign-spec.ts
  78. */
  79. var deepAssign = function (rst) {
  80. var args = [];
  81. for (var _i = 1; _i < arguments.length; _i++) {
  82. args[_i - 1] = arguments[_i];
  83. }
  84. for (var i = 0; i < args.length; i += 1) {
  85. deep(rst, args[i]);
  86. }
  87. return rst;
  88. };
  89. exports.deepAssign = deepAssign;
  90. //# sourceMappingURL=deep-assign.js.map