set.js 2.8 KB

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