set.js 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import get from './get';
  3. function internalSet(entity, paths, value, removeIfUndefined) {
  4. if (!paths.length) {
  5. return value;
  6. }
  7. const [path, ...restPath] = paths;
  8. let clone;
  9. if (!entity && typeof path === 'number') {
  10. clone = [];
  11. } else if (Array.isArray(entity)) {
  12. clone = [...entity];
  13. } else {
  14. clone = _extends({}, entity);
  15. }
  16. // Delete prop if `removeIfUndefined` and value is undefined
  17. if (removeIfUndefined && value === undefined && restPath.length === 1) {
  18. delete clone[path][restPath[0]];
  19. } else {
  20. clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);
  21. }
  22. return clone;
  23. }
  24. export default function set(entity, paths, value) {
  25. let removeIfUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  26. // Do nothing if `removeIfUndefined` and parent object not exist
  27. if (paths.length && removeIfUndefined && value === undefined && !get(entity, paths.slice(0, -1))) {
  28. return entity;
  29. }
  30. return internalSet(entity, paths, value, removeIfUndefined);
  31. }