object.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. export { has, pick, merge, isEqual, isEmpty, isObject, isPlainObject, clone, cloneDeep, defaults, defaultsDeep, } from 'lodash-es';
  2. export * from './mixins';
  3. export * from './inherit';
  4. export function ensure(value, defaultValue) {
  5. return value != null ? value : defaultValue;
  6. }
  7. export function getValue(obj, key, defaultValue) {
  8. const value = obj != null ? obj[key] : null;
  9. return defaultValue !== undefined ? ensure(value, defaultValue) : value;
  10. }
  11. export function getNumber(obj, key, defaultValue) {
  12. let value = obj != null ? obj[key] : null;
  13. if (value == null) {
  14. return defaultValue;
  15. }
  16. value = +value;
  17. if (Number.isNaN(value) || !Number.isFinite(value)) {
  18. return defaultValue;
  19. }
  20. return value;
  21. }
  22. export function getBoolean(obj, key, defaultValue) {
  23. const value = obj != null ? obj[key] : null;
  24. if (value == null) {
  25. return defaultValue;
  26. }
  27. return !!value;
  28. }
  29. export function isMaliciousProp(prop) {
  30. return prop === '__proto__';
  31. }
  32. export function getByPath(obj, path, delimiter = '/') {
  33. let ret;
  34. const keys = Array.isArray(path) ? path : path.split(delimiter);
  35. if (keys.length) {
  36. ret = obj;
  37. while (keys.length) {
  38. const key = keys.shift();
  39. if (Object(ret) === ret && key && key in ret) {
  40. ret = ret[key];
  41. }
  42. else {
  43. return undefined;
  44. }
  45. }
  46. }
  47. return ret;
  48. }
  49. export function setByPath(obj, path, value, delimiter = '/') {
  50. const keys = Array.isArray(path) ? path : path.split(delimiter);
  51. const lastKey = keys.pop();
  52. if (lastKey && !isMaliciousProp(lastKey)) {
  53. let diver = obj;
  54. keys.forEach((key) => {
  55. if (!isMaliciousProp(key)) {
  56. if (diver[key] == null) {
  57. diver[key] = {};
  58. }
  59. diver = diver[key];
  60. }
  61. });
  62. diver[lastKey] = value;
  63. }
  64. return obj;
  65. }
  66. export function unsetByPath(obj, path, delimiter = '/') {
  67. const keys = Array.isArray(path) ? path.slice() : path.split(delimiter);
  68. const propertyToRemove = keys.pop();
  69. if (propertyToRemove) {
  70. if (keys.length > 0) {
  71. const parent = getByPath(obj, keys);
  72. if (parent) {
  73. delete parent[propertyToRemove];
  74. }
  75. }
  76. else {
  77. delete obj[propertyToRemove];
  78. }
  79. }
  80. return obj;
  81. }
  82. // eslint-disable-next-line default-param-last
  83. export function flatten(obj, delim = '/', stop) {
  84. const ret = {};
  85. Object.keys(obj).forEach((key) => {
  86. const val = obj[key];
  87. let deep = typeof val === 'object' || Array.isArray(val);
  88. if (deep && stop && stop(val)) {
  89. deep = false;
  90. }
  91. if (deep) {
  92. const flatObject = flatten(val, delim, stop);
  93. Object.keys(flatObject).forEach((flatKey) => {
  94. ret[key + delim + flatKey] = flatObject[flatKey];
  95. });
  96. }
  97. else {
  98. ret[key] = val;
  99. }
  100. });
  101. // eslint-disable-next-line no-restricted-syntax
  102. for (const key in obj) {
  103. if (!Object.prototype.hasOwnProperty.call(obj, key)) {
  104. continue;
  105. }
  106. }
  107. return ret;
  108. }
  109. //# sourceMappingURL=object.js.map