記一次字串分割的工作

hellomarker發表於2019-03-09

拿到一個需求:要求將一個字串形態的規則可編輯化。

也就是將

A≥1 或 A≥1&B<3

轉↓化

記一次字串分割的工作

元件:A B C D T

符號:>< ≥ ≤ =

連線符:& |

思路:

先將字串形態的規則先做切割處理,由於要做校驗,再將切割好的字串片段存入對應的變數當中去。

具體思路:

  1. 先根據連線符切割成多個規則片段,每一個規則片段對應一個陣列索引
  2. 再根據每個規則片段進行分解切割
  3. 同類合併存到對應的屬性上

程式碼實踐:

    // 將後臺返回的字串規則切割成表單呈現
    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;
    },
複製程式碼

相關文章