js中如何對嵌套數(shù)組進(jìn)行filter過濾
js對嵌套數(shù)組進(jìn)行filter過濾
最近碰到一個需求,對嵌套數(shù)組進(jìn)行filter過濾,但是搜遍了CSDN,沒有找到合適的答案,最后也是解決了,記錄一下解決方法
由于返回的數(shù)據(jù)類型太復(fù)雜,這里只做一個小的樣例
listData = [ ? { ? ? name: 'zhangsan' ? ? data: [A,B,C] ? }, ? { ? ? name: 'lisi' ? ? data: [D,E,F] ? } ]
要求便是在data數(shù)組中進(jìn)行篩選,篩選出對應(yīng)的name,filter只能對第一層進(jìn)行篩選,當(dāng)時想到的是使用兩層filter,但是沒有用,最后經(jīng)過多次實驗,最后發(fā)現(xiàn)filter+find可以使用,看一下代碼部分
const filterRepositoryList = () => { ? if ( ? ? !slectedInfo.sigSelected && ? ? !slectedInfo.repositiorySelected && ? ? !slectedInfo.maintainerSelected ? ) { ? ? repoRenderList.value = repositioryList.value.slice(0, 99); ? ? getSigList(initialParams); ? } else { ? ? SigList.value = _.filter(allList.value, (item: any) => { ? ? ? return ( ? ? ? ? (!slectedInfo.sigSelected || ? ? ? ? ? item.sig_name === slectedInfo.sigSelected) && ? ? ? ? (!slectedInfo.repositiorySelected || ? ? ? ? ? item.repos.find((subItem: string) => { ? ? ? ? ? ? return subItem === slectedInfo.repositiorySelected; ? ? ? ? ? })) && ? ? ? ? (!slectedInfo.maintainerSelected || ? ? ? ? ? item.maintainers.find((subItem: string) => { ? ? ? ? ? ? return subItem === slectedInfo.maintainerSelected; ? ? ? ? ? })) ? ? ? ); ? ? }); ? ? paginationData.value.total = SigList.value.length; ? } };
這個代碼比較全了,包含了篩選的全部邏輯,因為當(dāng)時刪選的表格下面還有一個分頁條,所以進(jìn)行了判空,為空就展示全部數(shù)據(jù),加一個分片,不為空,就篩選,看一下代碼的主要部分
// 安裝了lodash,所以用了lodash的篩選 SigList.value = _.filter(allList.value, (item: any) => {? ? return ( ? ? (!slectedInfo.sigSelected || ? ? ?item.sig_name === slectedInfo.sigSelected) && ? ? ?// 雙層篩選主要代碼,在data數(shù)組中進(jìn)行find ? ? ?(!slectedInfo.repositiorySelected || ? ? ?item.repos.find((subItem: string) => { ? ? ? ?return subItem === slectedInfo.repositiorySelected; ? ? ?})) && ? ? ?(!slectedInfo.maintainerSelected || ? ? ?item.maintainers.find((subItem: string) => { ? ? ? ? return subItem === slectedInfo.maintainerSelected; ? ? ? })) ? ? ); });
這樣就實現(xiàn)了一個雙層的過濾。
js多層數(shù)組的Filter過濾
// 搜索框過濾 function searchFilter(list, key, num, prevList) { for (let i = list.length - 1; i >= 0; i--) { let item = list[i] if (item.children && Array.isArray(item.children) && item.children.length > 0) { searchFilter(item.children, key, i, list); } else { if (item.title && !item.title.includes(key)) { list.splice(i, 1) } } } if (Array.isArray(list) && list.length == 0) { if(prevList && num){ prevList.splice(num, 1) } } } //調(diào)用 searchFilter(list,key)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JS實現(xiàn)仿Windows經(jīng)典風(fēng)格的選項卡Tab切換代碼
這篇文章主要介紹了JS實現(xiàn)仿Windows經(jīng)典風(fēng)格的選項卡Tab切換代碼,涉及JavaScript元素的遍歷與樣式的修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10layui監(jiān)聽下拉選框選中值變化的方法(包含監(jiān)聽普通下拉選框)
今天小編大家分享一篇layui監(jiān)聽下拉選框選中值變化的方法(包含監(jiān)聽普通下拉選框),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09詳解Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用
許多應(yīng)用程序中都會有日志模塊,用于記錄系統(tǒng)在運(yùn)行過程中的一些關(guān)鍵信息,以便于對系統(tǒng)的運(yùn)行狀況進(jìn)行跟蹤。這篇文章給大家主要介紹了在Python中l(wèi)ogging日志模塊在多進(jìn)程環(huán)境下的使用,需要的朋友可以參考借鑒,下面來一起看看吧。2016-12-12