時間:2018年11月02日
比方說有這樣一堆數據:數組
arr: [{
id: '1',
type: 'a',
arr: [1, 2, 3, 4]
}, {
id: '2',
type: 'b',
arr: [1, 2, 3, 4, 5]
}]
複製代碼
集合裏面每一個元素都有兩個屬性,一個是type
,一個是arr
,arr
是一個數組。
需求是先判斷屬性,不一樣屬性對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就新建數組
}
}
}
})
複製代碼
這裏的_.key
是lodash
中獲取對象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