项目地址查看https://github.com/goblin-pitcher/data-adapter背景在开发过程中,往往需要减少对后端数据结构的依赖,避免前端由于接口数据结构的改变而导致的代码进行了大面积的修改。因此需要一个适配工具,统一管理转换规则。当接口数据结构发生变化时,只需要动态维护转换规则即可。需求分析先分析IO,实现方法如下/***@params{Object}data待转换数据*@paramsrules数据结构待定,转换规则*@params{Object}options转换配置*@returns{Object}adaptedData返回数据*/functionadapter(data,rules,options){}由于返回的数据量可能很大,为了避免不必要的开销,最好就地修改数据,所以返回的adaptedData满足adaptedData===数据。如果确定数据量不大,需要返回新的数据,使用时最好传入cloneDeep(data)。老版本原版是项目临时需求的产物。转换规则是匹配路径的键,值是转换后的路径或值。具体代码可以参考地址。示例如下:/***key为匹配路径,如:*'e|a'表示匹配key为e或a,*'b.c'表示匹配路径['b','c']*'/^c/'表示正则匹配键值,匹配规则为/^c/*写成支持多种类型混合,比如'e|a.b./^c/',会匹配obj[e|a][b][/^c/]*value可以表示转换后的路径或值,规则如下:*当value为字符串时,要转换的路径*当value为方法时,表示转换后的值,参数为:*data:匹配路径的值*path:匹配路径*obj:原始对象*/construles={"e|a":"b.a",//把obj.e或obj.a的值放在obj.b.a下"b.c":"b.d",//把obj.b.c的值"/^c/"放在obj.b.d下:"b.f",//放obj.b.f下obj下c开头的key"b.ff":"b.g.f",e:(data,path,obj)=>obj.a+obj.ca,//obj.e=obj.a+obj.ca"b.c":(data)=>data**2,//obj.b.c=obj.b.c**2};constobj={a:5,b:{g:{f:"xxx"},a:5,d:7,f:9},ca:8,cd:9}adapter(obj,rules)旧由于版本只是临时解决方案,因此无疑存在很多问题。在规则定义方面:比如b.c表示路径['b','c'],会导致以b.c为键值产生歧义。此外,字符串用于生成正则表达式,这在编写时需要添加许多额外的转义字符。在扩展性方面:老版本只支持一种配置,即retain——转换前是否保留item。这部分代码写的比较仓促,耦合度太强。增加一个新的配置需要修改很多地方,不方便扩展。新版本从规则定义开始。为了避免旧版本的很多问题,新版本规则使用Map。key是匹配路径,value是转换规则。具体使用方法请参考测试示例npmigit+https://github.com/goblin-pitcher/data-adapter.git-S------importadapterfrom'data-适配器';constobj={a:5,b:{g:{f:"xxx"},a:5,}}construles=newMap([['a','transKey-a'],[['b',/a|g/,'f'],(path,value)=>`transKey-${path[path.length-1]}`]])//转换后的数据格式如下://{//'transKey-a':5,//b:{//g:{//'transKey-f':"xxx"//},//a:5,//}//}适配器(obj,rules)adapter方法的格式如下:interfaceIOptions{retain?:boolean;transValue?:布尔值;matchFullRules?:布尔值;relativePath?:boolean,priority?:('string'|'regExp'|'function')[];}//当options为布尔类型时,表示配置{retain:options}typeRulesAndOptions=[rules:Rules,选项:布尔值|选项];接口适配器{(obj:Record
