需求場景:因為業務中需要去調用第三方的接口,某些字段需要做校驗,但是接口返回的規則都是一些提示,像這樣的: '金額區間: 140≤x≤350USD'、'最低金額: x≥140.89USD'、'三邊之和: 10.0cm≤x≤20.0cm'...需要自己去里面提取規則和上下限值來判斷。
范圍總共有 16 種情況:
- min ≤ x ≤ max
- min ≤ x < max
- min < x ≤ max
- min < x < max
- max ≥ x ≥ min
- max ≥ x > min
- max > x ≥ min
- max > x > min
- x ≤ max
- x < max
- x ≥ min
- x > min
- min ≤ x
- min < x
- max ≥ x
- max > x
function isRangeIn(x, str) {
if (!/^[+-]?(0|([1-9]d*))(.d+)?$/.test(x)) {
console.log('當前值非數字')
return
}
if (!str || (str && typeof str !== 'string')) return true // 規則字符串不存在默認通過
const arr = str.match(/d+(.d+)?/g)
if (!arr || !arr.length) return true // 未提取到范圍數據默認通過
const numFirst = +arr[0]
const numTwo = +arr[1]
let isVali = true
if (str.includes('≤x≤')) {
isVali = (numFirst <= x) && (x <= numTwo)
} else if (str.includes('≤x<')) {
isVali = (numFirst <= x) && (x < numTwo)
} else if (str.includes('<x≤')) {
isVali = (numFirst < x) && (x <= numTwo)
} else if (str.includes('<x<')) {
isVali = (numFirst < x) && (x < numTwo)
} else if (str.includes('≥x≥')) {
isVali = (numFirst >= x) && (x >= numTwo)
} else if (str.includes('≥x>')) {
isVali = (numFirst >= x) && (x > numTwo)
} else if (str.includes('>x≥')) {
isVali = (numFirst > x) && (x >= numTwo)
} else if (str.includes('>x>')) {
isVali = (numFirst > x) && (x > numTwo)
} else if (str.includes('x≤')) {
isVali = x <= numFirst
} else if (str.includes('x<')) {
isVali = x < numFirst
} else if (str.includes('x≥')) {
isVali = x >= numFirst
} else if (str.includes('x>')) {
isVali = x > numFirst
} else if (str.includes('≤x')) {
isVali = numFirst <= x
} else if (str.includes('<x')) {
isVali = numFirst < x
} else if (str.includes('≥x')) {
isVali = numFirst >= x
} else if (str.includes('>x')) {
isVali = numFirst > x
}
return isVali
}
// 測試
// const a = isRangeIn(6.9999999999, '第三長邊: 4.0cm<x<7.0cm')
// const a = isRangeIn(11, 'x>10.0cm')
// const a = isRangeIn(9, '兩長邊之和: 10.0cm≤x≤20.0cm')
// const a = isRangeIn('141', '金額區間: 140≤x≤350USD')
// console.log(a)
面對這種很無奈的需求,一定要自己從邏輯上梳理清楚,不要漏掉任何一種可能的情況
TODO
規則里如果有數字,上面提取出來的 numFirst 和 numTwo 會不對,如:兩短邊之和*2:x≤120cm,方法里的數字提取需優化