增長代碼的通用性-解析配置文件

時間:2018年11月02日
比方說有這樣一堆數據:數組

arr: [{
  id: '1',
  type: 'a',
  arr: [1, 2, 3, 4]
}, {
  id: '2',
  type: 'b',
  arr: [1, 2, 3, 4, 5]
}]
複製代碼

集合裏面每一個元素都有兩個屬性,一個是type,一個是arrarr是一個數組。
需求是先判斷屬性,不一樣屬性對arr的長度有着不一樣的需求。這裏咱們規定type如果‘a’,arr的長度最多爲4。type如果‘b’,arr的長度最多爲6;二者的報錯內容也並不相同。
個人本意是循環目標數組,以後先判斷是否符合type,再判斷arr是否符合條件,將不符合條件元素的id存到一個數組中,最後展現出來:bash

aError = [];
bError = [];
_.each(arr, (op) => {
  if (op.type === 'a') {
    if (op.arr.length > 4) {
      aError.push(op.id);
    }
  }
  if (op.type === 'b') {
    if (op.arr.length > 6) {
      bError.push(op.id);
    }
  }
})
if (aError) {
  const errMsg = `a的報錯提示:${aError.join(',')}`;
}
if (bError) {
  const errMsg = `b的報錯提示:${bError.join(',')}`;
}
複製代碼

寫完以後自我感受仍是不錯的,看上去挺清楚的,邏輯什麼的也很簡單,若是還有其餘的再增長就行了。
問題是寫完以後和同事討論了一下,以爲代碼的複用性太差,若是有新的條件會增長更多的代碼,這種重複造輪子的操做感受不是很好。因此商討以後咱們決定將條件寫成一個配置文件,經過讀取配置文件來解析條件,再進行判斷。
那麼配置文件須要什麼內容呢?主要有三部分,type類型、最大arr數量,還有報錯信息,因此咱們決定了配置文件的格式:ui

limitRule = {
  a: {
    max: '4',
    errMsg: 'content'
  },
  b: {
    max: '6',
    errMsg: 'content'
  }
}
複製代碼

直接把type類型當作了配置元素的key,減小了一個屬性。以後咱們就要開始循環配置文件了。spa

let limitIds = {};
const limitErrMsg = [];
_.each(arr, (op) => {
  if (_.keys(limitRule).includes(op.type)) { //獲取到配置文件中全部的類型,以後判斷當前類型是否在配置文件中
    if (op.arr.length > limitRule[op.type].max) {
      if (limitIds[op.type]) {
        limitIds[op.type].push(op.id);  //若是已經有這個type就直接push
      } else {
        limitIds[op.type] = [op.id];  //若是沒有這個type就新建數組
      }
    }
  }
})
複製代碼

這裏的_.keylodash中獲取對象key的方法。先判斷下當前元素的type是否在配置文件中,若是在再進行下一步判斷,判斷當前元素數組的長度是否是大於配置文件中當前配置的max值。如果大於,再將當前元素的id放到limitIds對象中,若是limitIds中沒有當前類型的數據,則新建一個,如果有則push進去。如此,咱們獲得的limitIds應該是這樣的:code

{
  a:[1, 3, 7],
  b: [7, 9, 10]
}
複製代碼

接下來咱們處理下limitIds,獲得報錯信息:對象

_.mapObject(limitIds, (value, key) => {
  if (value) {
    limitErrMsg.push(`${limitRule[key].errMsg}${value.join(',')}`)
  }
})
複製代碼

如此咱們就將全部的報錯信息放到limitErrMsg中了,以後輸出便可。總體方法是這樣的:string

//  配置文件
limitRule = {
  a: {
    max: '4',
    errMsg: 'content'
  },
  b: {
    max: '6',
    errMsg: 'content'
  }
};
//  新建存儲信息的變量
let limitIds = {};
const limitErrMsg = [];
//  處理數據
_.each(arr, (op) => {
  if (_.keys(limitRule).includes(op.type)) { //獲取到配置文件中全部的類型,以後判斷當前類型是否在配置文件中
    if (op.arr.length > limitRule[op.type].max) {
      if (limitIds[op.type]) {
        limitIds[op.type].push(op.id);  //若是已經有這個type就直接push
      } else {
        limitIds[op.type] = [op.id];  //若是沒有這個type就新建數組
      }
    }
  }
})
//  獲得錯誤信息
_.mapObject(limitIds, (value, key) => {
  if (value) {
    limitErrMsg.push(`${limitRule[key].errMsg}${value.join(',')}`)
  }
})
複製代碼

如此就將不一樣的判斷條件整合成了一個配置文件,以後如果還有相似的配置直接修改配置文件便可,簡直不要太方便。it

相關文章
相關標籤/搜索