set.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = set;
  7. exports.merge = merge;
  8. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  11. var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
  12. var _get = _interopRequireDefault(require("./get"));
  13. function internalSet(entity, paths, value, removeIfUndefined) {
  14. if (!paths.length) {
  15. return value;
  16. }
  17. var _paths = (0, _toArray2.default)(paths),
  18. path = _paths[0],
  19. restPath = _paths.slice(1);
  20. var clone;
  21. if (!entity && typeof path === 'number') {
  22. clone = [];
  23. } else if (Array.isArray(entity)) {
  24. clone = (0, _toConsumableArray2.default)(entity);
  25. } else {
  26. clone = (0, _objectSpread2.default)({}, entity);
  27. }
  28. // Delete prop if `removeIfUndefined` and value is undefined
  29. if (removeIfUndefined && value === undefined && restPath.length === 1) {
  30. delete clone[path][restPath[0]];
  31. } else {
  32. clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);
  33. }
  34. return clone;
  35. }
  36. function set(entity, paths, value) {
  37. var removeIfUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  38. // Do nothing if `removeIfUndefined` and parent object not exist
  39. if (paths.length && removeIfUndefined && value === undefined && !(0, _get.default)(entity, paths.slice(0, -1))) {
  40. return entity;
  41. }
  42. return internalSet(entity, paths, value, removeIfUndefined);
  43. }
  44. function isObject(obj) {
  45. return (0, _typeof2.default)(obj) === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype;
  46. }
  47. function createEmpty(source) {
  48. return Array.isArray(source) ? [] : {};
  49. }
  50. var keys = typeof Reflect === 'undefined' ? Object.keys : Reflect.ownKeys;
  51. /**
  52. * Merge objects which will create
  53. */
  54. function merge() {
  55. for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {
  56. sources[_key] = arguments[_key];
  57. }
  58. var clone = createEmpty(sources[0]);
  59. sources.forEach(function (src) {
  60. function internalMerge(path, parentLoopSet) {
  61. var loopSet = new Set(parentLoopSet);
  62. var value = (0, _get.default)(src, path);
  63. var isArr = Array.isArray(value);
  64. if (isArr || isObject(value)) {
  65. // Only add not loop obj
  66. if (!loopSet.has(value)) {
  67. loopSet.add(value);
  68. var originValue = (0, _get.default)(clone, path);
  69. if (isArr) {
  70. // Array will always be override
  71. clone = set(clone, path, []);
  72. } else if (!originValue || (0, _typeof2.default)(originValue) !== 'object') {
  73. // Init container if not exist
  74. clone = set(clone, path, createEmpty(value));
  75. }
  76. keys(value).forEach(function (key) {
  77. internalMerge([].concat((0, _toConsumableArray2.default)(path), [key]), loopSet);
  78. });
  79. }
  80. } else {
  81. clone = set(clone, path, value);
  82. }
  83. }
  84. internalMerge([]);
  85. });
  86. return clone;
  87. }