1. import { isFunction, isObject, isArray, isString } from '@/utils/dataType'
    2. /**
    3. * 映射类
    4. * 给对象的键名重命名,并可以给对应的值进行格式化
    5. * @param {*} target 映射目标 对象或数组
    6. * @param {*} reflectMap 映射map,按照key-value映射,
    7. * @param {*} isReflectReverse 是否反向映射,在不改变reflectMap的情况下,变成按照value-key映射
    8. */
    9. function ReflectObject(target, reflectMap, isReflectReverse) {
    10. this._reflectMap = reflectMap;
    11. this._target = target;
    12. this._isReflectReverse = isReflectReverse;
    13. this._result = [];
    14. execute.call(this)
    15. /**
    16. * 处理数据
    17. */
    18. function execute() {
    19. /**
    20. * 对象处理
    21. */
    22. function handlerObject() {
    23. this._result = {};
    24. const targetKeys = Object.keys(this._target);
    25. const reflectMapKeys = Object.values(this._reflectMap);
    26. reflectMapKeys.map((reflectMapKey, index) => {
    27. if (isString(reflectMapKey)) {
    28. this._result[reflectMapKey] = this._target[targetKeys[index]];
    29. } else if (isObject(reflectMapKey)) {
    30. let finalValue = ''
    31. if (isFunction(reflectMapKey.formatter)) {
    32. finalValue = reflectMapKey.formatter(this._target[targetKeys[index]], this._isReflectReverse)
    33. } else {
    34. finalValue = this._target[targetKeys[index]]
    35. }
    36. this._result[reflectMapKey.key] = finalValue;
    37. }
    38. });
    39. }
    40. /**
    41. * 数组处理
    42. */
    43. function handleArray() {
    44. this._result = [];
    45. this._target.map((targetItem) => {
    46. let reflect = new ReflectObject(targetItem, this._reflectMap, this._isReflectReverse);
    47. this._result.push(reflect.get());
    48. });
    49. }
    50. /**
    51. * 反向映射改变key-value变成value-key
    52. */
    53. function reverseReflectMap() {
    54. if (this._isReflectReverse) {
    55. let reflectMapKeys = Object.keys(this._reflectMap)
    56. let reflectMapValues = Object.values(this._reflectMap)
    57. let reflectMap = {}
    58. reflectMapValues.map((reflectMapValue, index) => {
    59. if (isString(reflectMapValue)) {
    60. reflectMap[reflectMapValue] = reflectMapKeys[index]
    61. } else if (isObject(reflectMapValue)){
    62. reflectMap[reflectMapValue.key] = {
    63. key: reflectMapKeys[index],
    64. formatter: isFunction(reflectMapValue.formatter) ? reflectMapValue.formatter : undefined,
    65. }
    66. }
    67. })
    68. this._reflectMap = reflectMap
    69. }
    70. }
    71. reverseReflectMap.call(this)
    72. if (isObject(this._target)) {
    73. handlerObject.call(this);
    74. } else if (isArray(this._target)) {
    75. handleArray.call(this);
    76. } else {
    77. throw new Error("target must be object or array");
    78. }
    79. }
    80. }
    81. /**
    82. * 获取最终结果
    83. */
    84. ReflectObject.prototype.get = function () {
    85. return this._result;
    86. };
    87. // 例子
    88. const target1 = [
    89. {
    90. a: '1', // a的值可能是1或-1
    91. v: "xm",
    92. },
    93. ];
    94. const target2 = [
    95. {
    96. age: 2,
    97. name: "xm",
    98. },
    99. ];
    100. /**
    101. * key 原对象的键名,类型:string
    102. * value 重命名对象的键名以及格式化处理函数, 类型:string | object
    103. * @type {{a: {formatter: reflectMap.a.formatter, key: string}, v: string}}
    104. */
    105. const reflectMap = {
    106. a: {
    107. /**
    108. * 要转成的键名
    109. * 类型:string
    110. */
    111. key: 'isShow',
    112. /**
    113. * 格式化函数
    114. * 类型:Function
    115. * @param value key对应的值
    116. * @param isReflectReverse 是否是反向映射
    117. * @returns {string}
    118. */
    119. formatter: function (value, isReflectReverse) {
    120. if (isReflectReverse) {
    121. return value === '是' ? '1' : '-1'
    122. } else {
    123. return Number(value) === 1 ? '是' : '否'
    124. }
    125. }
    126. },
    127. v: "name",
    128. };
    129. // 把a变成age,把v变成name
    130. let reflectObject = new ReflectObject(target1, reflectMap, false);
    131. console.log(reflectObject.get()); // [ { isShow: '是', name: 'xm' } ]
    132. // 把age变成a,把name变成v
    133. let reflectObject2 = new ReflectObject(target2, reflectMap, true);
    134. console.log(reflectObject2.get()); // [ { isShow: '-1', name: 'xm' } ]