dataFix.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { isObject } from './isObject';
  2. interface Rename {
  3. [propName: string]: string;
  4. }
  5. interface Config {
  6. lowerFirst?: boolean;
  7. rename?: Rename;
  8. remove?: string[];
  9. camel?: string[];
  10. bool?: string[];
  11. }
  12. const TRUE = ['true', 'TRUE', '1', 1];
  13. const FALSE = ['false', 'FALSE', '0', 0];
  14. export function dataFix(o: object, conf: Config, finalKill?: Function) {
  15. if (!isObject(o)) return;
  16. const {
  17. remove = [],
  18. rename = {},
  19. camel = [],
  20. bool = [],
  21. lowerFirst = false,
  22. } = conf;
  23. // 删除不需要的数据
  24. remove.forEach(v => delete o[v]);
  25. // 重命名
  26. Object.entries(rename).forEach(v => {
  27. if (!o[v[0]]) return;
  28. if (o[v[1]]) return;
  29. o[v[1]] = o[v[0]];
  30. delete o[v[0]];
  31. });
  32. // 驼峰化
  33. camel.forEach(v => {
  34. if (!o[v]) return;
  35. const afterKey = v
  36. .replace(/^(.)/, $0 => $0.toLowerCase())
  37. .replace(/-(\w)/g, (_, $1) => $1.toUpperCase());
  38. if (o[afterKey]) return;
  39. o[afterKey] = o[v];
  40. // todo 暂时兼容以前数据,不做删除
  41. // delete o[v];
  42. });
  43. // 转换值为布尔值
  44. bool.forEach(v => {
  45. o[v] = fixBool(o[v]);
  46. });
  47. // finalKill
  48. if (typeof finalKill === 'function') {
  49. finalKill(o);
  50. }
  51. // 首字母转小写
  52. fixLowerFirst(o, lowerFirst);
  53. return dataFix;
  54. }
  55. function fixBool(value) {
  56. if (!value) return false;
  57. if (TRUE.includes(value)) return true;
  58. return FALSE.includes(value) ? false : value;
  59. }
  60. function fixLowerFirst(o, lowerFirst) {
  61. if (lowerFirst) {
  62. Object.keys(o).forEach(key => {
  63. const lowerK = key.replace(/^\w/, match => match.toLowerCase());
  64. if (typeof o[lowerK] === 'undefined') {
  65. o[lowerK] = o[key];
  66. delete o[key];
  67. }
  68. });
  69. }
  70. }