setData
方法支持路径表达式来设置属性,例如 setData({"x.y.z": 1})
。微信官方没有公布路径表达式的语法规则及解析规则,本文所描述的路径表达式解析规则由 miniprogrampatch 实现并总结而来。
在成县等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、网站建设 网站设计制作定制网站开发,公司网站建设,企业网站建设,品牌网站制作,全网营销推广,成都外贸网站制作,成县网站建设费用合理。概述小程序的路径表达式基本操作符包括对象属性访问符.
和数组成员访问符[]
。
例如:
a.b
表示访问对象 a
的 b
属性。
a[0]
表示访问数组 a
的第 2 个成员。
a[0]b
表示访问数组 a
的第 2 个成员的 b
属性。当对象属性访问符和数组成员访问符连在一起时,可以省略书写属性访问符。
数组关闭符与属性访问符在特殊情况下省略属性访问符会产生歧义,参见下文“路径表达式解析奇葩规则”。
例如:a.[0].b
等同于 a[0]b
。
[
开头。
不能以未关闭的数组符号加上属性表达式结尾,例如 a[bc
是非法的。
不能存在空数组表达式,即不能包含 []
字符。
第一个数组表达式关闭符号 ]
不能在第一个数组表达式起始符号 [
之前。
路径表达式解析时会遵循以下规则:
连续多个属性访问符会被转换为一个,即 a...b.c
等于 a.b.c
。
以属性访问符开头或结尾会被删除,即 .a.b.
等同于 a.b
。
处于结尾的未关闭数组表达式会被删除,即 x.y[12
,x.y[[[[
均等同于 x.y
。
连续多个空字符串会被转换为一个。
路径表达式解析时奇葩规则:
数组表达式中只能包含数字、句号、左方括号。
所以数组表达式中不能使用负数,例如 a[-1]
是非法的。
数组表达式中的句号和左方括号都将被删除,例如 a[.1.1.]
等同于 a[11]
,a[.[.[[1]
等同于 a[1]
。
每个单独的数组关闭符号 ]
都会生成新的数组,而所有单独的数组关闭符号之间的字符串(不包含属性访问符.
)将被提取出来拼接成一个属性名称。
例如 x[1]2]3] 4x ]y
等同于 x[1][0][0][0]23 4x y
,但 x[1]2]3] 4x ].y
等同于 x[1][0][0][0]23 4x .y
。(此处不满足上文所说属性访问符和数组访问符在一起时可以省略书写属性访问符的规则)
当单独数组关闭符号中间包含属性访问符时,优先解析属性访问符。
例如 x[1]2].a3]x
等同于 x[1][0]2[0]a3x
。
示例合法路径及其解析结果:
原路径 | 解析结果 |
---|---|
"x" | "x", |
"x.y.z" | "x.y.z", |
"1.2" | "1.2", |
"x.y.[2][12]xy.z" | "x.y[2][12]xy.z", |
"x.y[11.11]z" | "x.y[1111]z", |
"x.y[.11.]z" | "x.y[11]z", |
"x[1111" | "x", |
"x[1[2]23" | "x[12]23", |
"x[1][2]]]]y" | "x[1][2][0][0][0]y", |
"x[1].[.[.[2]]]]y" | "x[1][2][0][0][0]y", |
"x[1]23]4]5]6]y" | "x[1][0][0][0][0]23456y", |
"x[1]23]4]5x ]6]" | "x[1][0][0][0][0]2345x 6", |
"x[1]23]4]5]6].y" | "x[1][0][0][0][0]23456.y", |
"b[1]2].a3].x" | "b[1][0]2[0]a3.x" |
非法路径及其非法原因:
原路径 | 非法原因 |
---|---|
"" | 空字符串非法 |
"[1]x" | 数组开头非法 |
"x]][0]" | 第一个 ] 出现在第一个 [ 之前 |
"x[a]" | 数组中只能包含数字 |
"x[abc" | 未关闭数组符号,且紧跟非数字 |
"x[]" | 存在空数组符号 |
"x[-1]" | 数组中只能包含数字 |
"x[ 1]" | 数组中只能包含数字 |
"x[.]" | 数组中的句号会被删除,导致存在空数组 |
"x[1 1]" | 数组中只能包含数字 |
"x[ ]" | 数组中只能包含数字 |
小程序路径表达式解析方案具体实现及测试参见 miniprogrampatch