[TOC]
>[success] # 前端多條件篩選數據
~~~
需求:如下圖,有'橋梁名稱(字符串)'、'橋梁類型(數組)'、'橋梁分類(數組)'三個過濾條件用這'3'個
篩選條件'依次過濾'列表并且返回過濾后的結果,如果'橋梁名稱'沒有匹配到篩選結果返回'空數組','橋梁類型'
和'橋梁分類'就不繼續進行篩選。
~~~

<br/>
>[success] ## 解決思路1(if深層嵌套)
~~~
這個屬于笨方法,思路:'if'判斷'橋梁名稱'有值,再在'if'中判斷'橋梁類型'有值,再在'if'中判斷
'橋梁分類'有值,反復'嵌套if'
~~~
JSON數據
~~~
let bridgeDataArr = [{
"bridgeName": "橋梁1",
"bridgeType": "混凝土梁式橋",
"bridgeCategory": "特大橋",
}, {
"bridgeName": "橋梁2",
"bridgeType": "鋼梁橋",
"bridgeCategory": "大橋",
}, {
"bridgeName": "橋梁3",
"bridgeType": "懸索橋",
"bridgeCategory": "中橋"
},
{
"bridgeName": "橋梁4",
"bridgeType": "斜拉橋",
"bridgeCategory": "小橋"
},
{
"bridgeName": "橋梁5",
"bridgeType": "斜拉橋",
"bridgeCategory": "涵洞"
}]
~~~
JS代碼
~~~
// 篩選條件
let filterCondition = [
{
bridgeName: '橋梁1',
bridgeType: [],
bridgeCategory: []
},
{
bridgeName: '橋梁5',
bridgeType: ['斜拉橋', '鋼梁橋'],
bridgeCategory: []
},
{
bridgeName: '橋梁5',
bridgeType: ['斜拉橋', '鋼梁橋'],
bridgeCategory: ['涵洞']
},
{
bridgeName: '亂七八糟的橋梁',
bridgeType: ['斜拉橋', '鋼梁橋'],
bridgeCategory: ['涵洞']
}
]
// 最終過濾結果
let finalResults = []
// 過濾方法
function filterFun(data){
// 1 - 4的隨機數
let num = Math.floor(Math.random()*4+1)
// 橋梁名稱有值
if(filterCondition[num].bridgeName){
// 橋梁類型有值
if(filterCondition[num].bridgeType.length > 0){
// 橋梁分類有值
if(filterCondition[num].bridgeCategory.length > 0){
...
} else {
...
}
} else {
...
}
} else {
// 橋梁名稱無值
// 橋梁類型有值
if(filterCondition[num].bridgeType.length > 0){
// 橋梁分類有值
if(filterCondition[num].bridgeCategory.length > 0){
...
} else {
...
}
} else {
...
}
}
}
filterFun(bridgeDataArr)
~~~
~~~
上面的寫法雖然可以實現想要的過濾結果,但是'嵌套'過于復雜以后新'增加篩選條件'這里代碼要發生
天翻地覆的變化。
~~~
<br/>
>[success] ## 解決思路2(解決if深層嵌套的問題)
~~~
雖然這個方法可以解決,但是也是'野路子'判斷,雖然說避免了'反復嵌套if'判斷,把它修改成'同級'的'if'判斷,
但是以后'新增過濾條件'后這里也會發生很大的變化。
~~~
~~~
// 過濾方法
function filterFun(data){
// 1 - 4的隨機數
let num = Math.floor(Math.random()*4+1)
// 橋梁名稱、橋梁類型、橋梁分類有值
if(filterCondition[num].bridgeName && filterCondition[num].bridgeType.length > 0 && filterCondition[num].bridgeCategory.length > 0){
三個條件過濾操作...
}
else if(filterCondition[num].bridgeName && filterCondition[num].bridgeType.length > 0){
// 橋梁名稱、橋梁類型有值
過濾操作...
}
else if(filterCondition[num].bridgeName && filterCondition[num].bridgeCategory.length > 0){
// 橋梁名稱、橋梁分類有值
過濾操作...
}
else if(filterCondition[num].bridgeType.length > 0 && filterCondition[num].bridgeCategory.length > 0){
// 橋梁類型、橋梁分類有值
過濾操作...
}
else if(filterCondition[num].bridgeName){
// 橋梁名稱有值
過濾操作...
}
else if(filterCondition[num].bridgeType.length > 0){
// 橋梁類型有值
過濾操作...
}
else if(filterCondition[num].bridgeCategory){
// 橋梁分類有值
過濾操作...
}
}
~~~
<br/>
>[success] ## 解決思路3
~~~
這種方法可以解決多種情況:
1. 無過濾條件時,只走'filterResultArr'賦值全部數據
2. '橋梁名稱'有值用橋梁名稱過濾后的結果,在'橋梁類型'、'橋梁分類'中繼續來過濾,如果在'橋梁名稱'這
過濾返回值為'空數組',就不會往下走
~~~
~~~
// 過濾方法
function filterFun(data){
let filterResultArr = [] // 最終過濾結果
let bridgeNameFilter = [] // 橋梁名稱過濾結果
let bridgeTypeFilter = [] // 橋梁類型過濾結果
let bridgeCategoryFilter = [] // 橋梁分類過濾結果
if(data.length > 0){ // 項目下橋梁列表不為空
filterResultArr = data
if(this.filterCondition.bridgeName){ // 橋梁名稱有值
bridgeNameFilter = filterResultArr.filter(item => {
return item.bridgeName.includes(this.filterCondition.bridgeName.toUpperCase())
})
filterResultArr = bridgeNameFilter
}
if(filterResultArr.length > 0 && this.filterCondition.bridgeType.length > 0){ // 橋梁類型有值
bridgeTypeFilter = filterResultArr.filter(item => {
return this.filterCondition.bridgeType.some(ele => ele === item.bridgeType)
})
filterResultArr = bridgeTypeFilter
}
if(filterResultArr.length > 0 && this.filterCondition.bridgeCategory.length > 0){ // 橋梁分類有值
bridgeCategoryFilter = filterResultArr.filter(item => {
return this.filterCondition.bridgeCategory.some(ele => ele === item.bridgeCategory)
})
filterResultArr = bridgeCategoryFilter
}
}
// 返回最終過濾結果
return filterResultArr
}
~~~
<br/>
>[success] ## 1對多過濾
~~~
顧名思義'1對多',如下:我想根據輸入結果去這3個條件(跨、部件、構件)中過濾出符合任意一個條件的結果
~~~

實現如下:
~~~
let value = '2' // 輸入框值
let arr = [ // 要過濾的數據
{
K: '第1跨',
BJ: '部件1',
GJ: '構件1'
},
{
K: '第2跨',
BJ: '部件2',
GJ: '構件2'
}
]
// 過濾條件
let isKorBJorGJ = item => item.K.includes(value) || item.BJ.includes(value) || item.BJ.includes(value)
console.log(arr.filter(item => isKorBJorGJ(item))) // 第二跨
~~~
- vue復選框邏輯
- get請求給后臺傳數組
- 提交表單時傳值參數處理方案
- Element ui上傳圖片功能
- async和await的使用
- 時間戳轉換
- 日期格式轉換時間戳
- 時間戳轉換日期格式
- 對深拷貝的認知總結
- vue-右鍵菜單功能
- textarea中換行、回車、空格的識別與處理
- element ui表格合并
- 合并行(上下行)
- 雙層for循環
- 數組去重
- 瀑布流
- 前端多條件篩選
- 閉包的理解
- 改變this指向
- vue單選框邏輯
- 對象數組根據某個屬性來進行排序
- vscode插件整理
- 對象數組多條件去重
- Blob類型數據轉換Json數據類型
- Element ui做批量上傳功能
- 前端cookie和后端cookie
- 強制轉換https協議
- 給事件傳額外參數
- 樹形結構數據處理
- 查找所有父級數據
- 根據id篩選單條數據
- 動態引入阿里圖標庫
- 四舍五入
- 封裝一個Promise.allSettled方法
- 判斷輸入框內是否有emoji表情
- element-ui的popover組件位置偏移
- formData上傳文件時,攜帶【數組對象參數】
- 前端解壓壓縮包(zip)解壓后上傳解壓的文件
- element ui表格列相同解決辦法
- elementUI,table復選框多選,翻頁/切換條數時保持選中狀態
- cookie 和 token 的區別