小程序 setData
方法支持路徑表達式來設置屬性,例如 setData({"x.y.z": 1})
。git
微信官方沒有公佈路徑表達式的語法規則及解析規則,本文所描述的路徑表達式解析規則由 miniprogrampatch 實現並總結而來。github
小程序的路徑表達式基本操做符包括對象屬性訪問符.
和數組成員訪問符[]
。小程序
例如:數組
a.b
表示訪問對象 a
的 b
屬性。a[0]
表示訪問數組 a
的第 2 個成員。a[0]b
表示訪問數組 a
的第 2 個成員的 b
屬性。當對象屬性訪問符和數組成員訪問符連在一塊兒時,能夠省略書寫屬性訪問符。微信
數組關閉符與屬性訪問符在特殊狀況下省略屬性訪問符會產生歧義,參見下文「路徑表達式解析奇葩規則」。測試
例如:a.[0].b
等同於 a[0]b
。code
[
開頭。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" |
非法路徑及其非法緣由:ip
原路徑 | 非法緣由 |
---|---|
"" | 空字符串非法 |
"[1]x" | 數組開頭非法 |
"x]][0]" | 第一個 ] 出如今第一個 [ 以前 |
"x[a]" | 數組中只能包含數字 |
"x[abc" | 未關閉數組符號,且緊跟非數字 |
"x[]" | 存在空數組符號 |
"x[-1]" | 數組中只能包含數字 |
"x[ 1]" | 數組中只能包含數字 |
"x[.]" | 數組中的句號會被刪除,致使存在空數組 |
"x[1 1]" | 數組中只能包含數字 |
"x[ ]" | 數組中只能包含數字 |
小程序路徑表達式解析方案具體實現及測試參見 miniprogrampatch字符串