版博士V2.0程序
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

56 líneas
1.6 KiB

  1. function isObject(value) {
  2. return value !== null && typeof value === "object";
  3. }
  4. function _defu(baseObject, defaults, namespace = ".", merger) {
  5. if (!isObject(defaults)) {
  6. return _defu(baseObject, {}, namespace, merger);
  7. }
  8. const object = Object.assign({}, defaults);
  9. for (const key in baseObject) {
  10. if (key === "__proto__" || key === "constructor") {
  11. continue;
  12. }
  13. const value = baseObject[key];
  14. if (value === null || value === void 0) {
  15. continue;
  16. }
  17. if (merger && merger(object, key, value, namespace)) {
  18. continue;
  19. }
  20. if (Array.isArray(value) && Array.isArray(object[key])) {
  21. object[key] = [...value, ...object[key]];
  22. } else if (isObject(value) && isObject(object[key])) {
  23. object[key] = _defu(
  24. value,
  25. object[key],
  26. (namespace ? `${namespace}.` : "") + key.toString(),
  27. merger
  28. );
  29. } else {
  30. object[key] = value;
  31. }
  32. }
  33. return object;
  34. }
  35. function createDefu(merger) {
  36. return (...arguments_) => (
  37. // eslint-disable-next-line unicorn/no-array-reduce
  38. arguments_.reduce((p, c) => _defu(p, c, "", merger), {})
  39. );
  40. }
  41. const defu = createDefu();
  42. const defuFn = createDefu((object, key, currentValue) => {
  43. if (typeof object[key] !== "undefined" && typeof currentValue === "function") {
  44. object[key] = currentValue(object[key]);
  45. return true;
  46. }
  47. });
  48. const defuArrayFn = createDefu((object, key, currentValue) => {
  49. if (Array.isArray(object[key]) && typeof currentValue === "function") {
  50. object[key] = currentValue(object[key]);
  51. return true;
  52. }
  53. });
  54. export { createDefu, defu as default, defu, defuArrayFn, defuFn };