記一次字符串分割的工做

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

也就是將javascript

A≥1 或 A≥1&B<3java

轉↓化數組

元件:A B C D Tdom

符號:>< ≥ ≤ =優化

鏈接符:& |spa

思路:

先將字符串形態的規則先作切割處理,因爲要作校驗,再將切割好的字符串片斷存入對應的變量當中去。3d

具體思路:

  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;
    },
複製代碼

結果:

優化後的執行代碼

這是根據老姚評論給出的方法優化而來的,能夠去評論區圍觀之~code

// 將後臺返回的字符串規則切割成表單呈現(配合修改用戶標籤使用)
    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;
    },
複製代碼
相關文章
相關標籤/搜索