createMyTrans / dlsjsTrans
createMyTrans方法用于构建一个自定义的 JSON 翻译器,将存储在 JSON 中的配置(包括函数、异步操作等)翻译为可执行的 JavaScript 对象。dlsjsTrans 是 dlsjs 提供的预设翻译器实例,使用默认规则。
语法
javascript
createMyTrans(rules)
dlsjsTrans(jsonObj, scope)描述
createMyTrans 函数接收一个 rules 参数,用于扩展预设的翻译规则,返回一个新的翻译器函数。翻译器内部使用 deepConvert 进行深度遍历,对 JSON 对象中的每一个值根据规则进行翻译。
翻译器的工作原理
翻译器在遍历 JSON 对象时,会按照以下优先级匹配规则:
- 保留键名(reservedKey):当键名匹配时,将键值送入对应函数解析
- 保留属性(reservedProperty):当对象包含特定属性时,将整个对象送入对应函数解析,返回值替换原对象
- 保留深度属性(reservedDeepProperty):类似保留属性,但返回值会继续被翻译
- 保留字(reservedWord):当字符串值匹配
@关键字/内容格式时,将内容部分送入对应函数解析
预设规则说明
保留属性(reservedProperty):
| 属性 | 说明 |
|---|---|
@step | 创建多步函数,支持 custom 和 eval 两种步骤类型 |
@json | 将字符串通过 JSON.parse 解析为对象 |
保留字(reservedWord):
| 关键字 | 说明 | 返回值 |
|---|---|---|
@scope | 从 scope.data 中取值 | 对应路径的数据 |
@dataScope | 同 @scope | 对应路径的数据 |
@eval | 构造一个返回表达式值的函数 | function |
@funcEval | 构造并立即执行函数,返回结果 | any |
@func | 构造一个可调用函数,参数通过 args 传入 | function |
@async | 构造一个返回 Promise 的异步函数 | async function |
保留字的使用格式为 @关键字/表达式,例如 @eval/scope.value + 1。
自定义规则
通过 createMyTrans(rules) 可以扩展以下四类规则:
rules.reservedProperty- 扩展保留属性rules.reservedDeepProperty- 扩展保留深度属性rules.reservedWord- 扩展保留字rules.reservedKey- 扩展保留键名
自定义规则会与预设规则合并(Object.assign),同名规则会覆盖预设规则。
注意事项
- 翻译器内部使用
new Function动态构造函数,存在安全风险,不要翻译不可信的 JSON 数据 @eval、@funcEval、@func、@async构造的函数可以访问scope、RW、dayjs三个变量@scope和@dataScope从scope.data中取值,路径需以#/开头@step中的custom类型步骤需要通过params.funcScope提供自定义函数dlsjsTrans是createMyTrans({})的返回值,使用所有预设规则- 翻译器会递归处理对象和数组,直到所有可翻译的内容都被处理
- 终止符判断(isTerminator)用于防止翻译器无法停止,匹配到保留属性或保留字时会识别为分支终点
- 该函数依赖 ramda 和 dayjs
示例
使用预设翻译器
创建自定义翻译器
浏览器兼容
createMyTrans 和 dlsjsTrans 使用了 new Function、箭头函数、async/await 等特性,需要支持 ES2017 的浏览器环境:
- Chrome 55+
- Firefox 52+
- Safari 11+
- Edge 15+
不支持 IE 浏览器。
性能考虑
- 时间复杂度: O(n) - 其中 n 是 JSON 对象中所有节点的数量(深度遍历)
- 空间复杂度: O(n) - 需要存储翻译后的对象和递归调用栈
new Function的构造开销较大,建议对同一配置只翻译一次并缓存结果- 翻译器内部使用
Object.assign合并规则,每次调用createMyTrans都会生成新的规则集 - 对于大型 JSON 配置,建议分块翻译或使用懒加载策略
@async创建的异步函数每次调用都会重新执行,应注意避免在循环中频繁调用
相关函数
deepConvert- 深度遍历对象的核心方法,翻译器内部使用RW- 路径访问函数,翻译器内部通过它访问 scope.datamatchRules- 通用条件判断,可用于翻译结果的校验