拿到一個需求:要求將一個字串形態的規則可編輯化。
也就是將
A≥1 或 A≥1&B<3
轉↓化
元件:A B C D T
符號:>< ≥ ≤ =
連線符:& |
思路:
先將字串形態的規則先做切割處理,由於要做校驗,再將切割好的字串片段存入對應的變數當中去。
具體思路:
- 先根據連線符切割成多個規則片段,每一個規則片段對應一個陣列索引
- 再根據每個規則片段進行分解切割
- 同類合併存到對應的屬性上
程式碼實踐:
// 將後臺返回的字串規則切割成表單呈現
parseDomins(data) {
let domains = [];
data = data.replace(/&/g, "@&");
data = data.replace(/[|]/g, "@|");
data.split("@").forEach(item => {
if (item == "") return;
domains.push({});
item = item.replace(/&/g, "&@");
item = item.replace(/[|]/g, "|@");
item = item.replace(/≥/g, "@≥@");
item = item.replace(/≤/g, "@≤@");
item = item.replace(/>/g, "@>@");
item = item.replace(/=/g, "@=@");
item = item.replace(/</g, "@<@");
item.split("@").forEach(subitem => {
if (item == "") return;
switch (subitem) {
case "&":
case "|":
if (domains[domains.length - 1].connectionSymbol)
domains[domains.length - 1].connectionSymbol += subitem;
else domains[domains.length - 1].connectionSymbol = subitem;
break;
case "A":
case "B":
case "C":
case "D":
case "T":
if (domains[domains.length - 1].elementType)
domains[domains.length - 1].elementType += subitem;
else domains[domains.length - 1].elementType = subitem;
break;
case "≥":
case "≤":
case ">":
case "<":
case "=":
if (domains[domains.length - 1].symbol)
domains[domains.length - 1].symbol += subitem;
else domains[domains.length - 1].symbol = subitem;
break;
default:
if (domains[domains.length - 1].num)
domains[domains.length - 1].num += subitem;
else domains[domains.length - 1].num = subitem;
break;
}
});
});
return domains;
},
複製程式碼
結果:
優化後的執行程式碼
這是根據老姚評論給出的方法優化而來的,可以去評論區圍觀之~
// 將後臺返回的字串規則切割成表單呈現(配合修改使用者標籤使用)
parseDomins(data) {
let temp = [];
data = data.replace(/(\&|\|)/g, (match, p1) => `@${p1}`);
data.split("@").forEach(item => {
temp.push({});
item.replace(
/(\&|\|)?([ABCDT])(>|<|≥|≤|=)(\d+)/,
(match, connectionSymbol, elementType, symbol, num) => {
temp[temp.length - 1].connectionSymbol = connectionSymbol;
temp[temp.length - 1].elementType = elementType;
temp[temp.length - 1].symbol = symbol;
temp[temp.length - 1].num = num;
}
);
});
return temp;
},
複製程式碼