import { isFunction, isObject, isArray, isString } from '@/utils/dataType'/** * 映射类 * 给对象的键名重命名,并可以给对应的值进行格式化 * @param {*} target 映射目标 对象或数组 * @param {*} reflectMap 映射map,按照key-value映射, * @param {*} isReflectReverse 是否反向映射,在不改变reflectMap的情况下,变成按照value-key映射 */function ReflectObject(target, reflectMap, isReflectReverse) { this._reflectMap = reflectMap; this._target = target; this._isReflectReverse = isReflectReverse; this._result = []; execute.call(this) /** * 处理数据 */ function execute() { /** * 对象处理 */ function handlerObject() { this._result = {}; const targetKeys = Object.keys(this._target); const reflectMapKeys = Object.values(this._reflectMap); reflectMapKeys.map((reflectMapKey, index) => { if (isString(reflectMapKey)) { this._result[reflectMapKey] = this._target[targetKeys[index]]; } else if (isObject(reflectMapKey)) { let finalValue = '' if (isFunction(reflectMapKey.formatter)) { finalValue = reflectMapKey.formatter(this._target[targetKeys[index]], this._isReflectReverse) } else { finalValue = this._target[targetKeys[index]] } this._result[reflectMapKey.key] = finalValue; } }); } /** * 数组处理 */ function handleArray() { this._result = []; this._target.map((targetItem) => { let reflect = new ReflectObject(targetItem, this._reflectMap, this._isReflectReverse); this._result.push(reflect.get()); }); } /** * 反向映射改变key-value变成value-key */ function reverseReflectMap() { if (this._isReflectReverse) { let reflectMapKeys = Object.keys(this._reflectMap) let reflectMapValues = Object.values(this._reflectMap) let reflectMap = {} reflectMapValues.map((reflectMapValue, index) => { if (isString(reflectMapValue)) { reflectMap[reflectMapValue] = reflectMapKeys[index] } else if (isObject(reflectMapValue)){ reflectMap[reflectMapValue.key] = { key: reflectMapKeys[index], formatter: isFunction(reflectMapValue.formatter) ? reflectMapValue.formatter : undefined, } } }) this._reflectMap = reflectMap } } reverseReflectMap.call(this) if (isObject(this._target)) { handlerObject.call(this); } else if (isArray(this._target)) { handleArray.call(this); } else { throw new Error("target must be object or array"); } }}/** * 获取最终结果 */ReflectObject.prototype.get = function () { return this._result;};// 例子const target1 = [ { a: '1', // a的值可能是1或-1 v: "xm", },];const target2 = [ { age: 2, name: "xm", },];/** * key 原对象的键名,类型:string * value 重命名对象的键名以及格式化处理函数, 类型:string | object * @type {{a: {formatter: reflectMap.a.formatter, key: string}, v: string}} */const reflectMap = { a: { /** * 要转成的键名 * 类型:string */ key: 'isShow', /** * 格式化函数 * 类型:Function * @param value key对应的值 * @param isReflectReverse 是否是反向映射 * @returns {string} */ formatter: function (value, isReflectReverse) { if (isReflectReverse) { return value === '是' ? '1' : '-1' } else { return Number(value) === 1 ? '是' : '否' } } }, v: "name",};// 把a变成age,把v变成namelet reflectObject = new ReflectObject(target1, reflectMap, false);console.log(reflectObject.get()); // [ { isShow: '是', name: 'xm' } ]// 把age变成a,把name变成vlet reflectObject2 = new ReflectObject(target2, reflectMap, true);console.log(reflectObject2.get()); // [ { isShow: '-1', name: 'xm' } ]