背景
配置名次的时候要求输入1-3,5,7-10等这类 可以是一个名次区间也可以是单个名次
要求:
1、只能输入名次区间或者单个名次及英文, 其他格式均提示错误
2、输入的名次不能有重叠
输入名次的正则校验
let reg = /^[0-9]*(?:-\d+)?(?:,\d+(?:-\d+)?)*$/
名次重叠判断
判断重叠的思路来自这里
具体思路如下:区间以[minNum, maxNum]的形式存放,有n组,先将n组区间以minNum值排序,然后再遍历数组,用当前组的最大值与下一组的最小值比较如果大于等于则有重复名次否则没有。
// mock 名次数据大概如下
let ranking = '1-3,4,10-20,30,15'
let rankList = []
ranking.split(',').forEach(v => {
const maxNum = Math.max(...v.split('-'))
const minNum = Math.min(...v.split('-'))
rankList.push([minNum, maxNum])
})
// 以minNum值排序
rankList.sort((a, b) => a[0] - b[0])
// 设置是否重叠的参数
let isRepeat = false
// 遍历数组
for (let i = 0; i < rankList.length - 1; i++) {
let maxCur = rankList[i][1];
let minNext = rankList[i + 1][0];
//判断当前区间的最大值是否大于等于下一组区间的最小值
if (+maxCur >= +minNext) {
isRepeat = true
break;
}
}
if (isRepeat) {
message.error('发奖名次重叠,无法保存')
return
}