三级城市数据过滤禁选城市

需求是在后台管理配置仅发省份,拦截省份、拦截城市以及拦截区/县;在页面上展示对应的数据

  • 配置仅发省份,下拉框选择数据就只能展示配置的省份;并且允许与拦截城市、拦截区一起使用
  • 配置拦截省份,顾名思义就是不没有该省份的数据了 城市、区县同理。
// 原始数据
let regions = [
    {
        label:'河南省',
        children:[
            {
                label:'郑州市',
                children:[
                    {label:'中原区'},
                    {label:'大兴区'},
                ]
            },
            {
                label:'鹤壁市',
                children:[
                    {label:'浚县'},
                    {label:'淇县'},
                ]
            }
        ]
    },
    {
        label:'北京市',
        children:[
            {
                label:'北京市',
                children:[
                    {label:'丰台区'},
                    {label:'大兴区'},
                ]
            }
        ]
    }... ...
]
// 把数据整理好之后,就该第二步过滤数据了,因为是三层数据,所以用的链式处理数据 filter、map以及includes
// 第一个参数:数据,第二个参数:要过滤的数据
function filterRegions(regions,excludedRegions){
    return regions.filter(provinceObj=>!!excludedRegions.provinces.includes(provinceObj.label)).map(provinceItem=>(
        label: provinceItem.label,
        children: provinceItem.children
        .filter((cityObj: Options) => !excludedRegions.cities.includes(cityObj.label))
        .map((cityItem: Options) => ({
            label: cityItem.label,
            children: cityItem.childern
            .filter((dist: Options) => !excludedRegions.district.includes(dist.label)),
        })
    ))
}
// 从后端获取禁发省份区的数据
let excludeRegions = {
    provinces: ['河南省','北京市'], // 以逗号分隔的数组
    cities:['郑州市'],
    district:['浚县'],
}
// 从后端获取仅发省份的数据
let subProvince = ['河南省'];

useEffect(()=>{
    // 城市数据
    let arrList=[];
    // 过滤的城市
    let obj = {
        provinces: excludeRegions.provinces ?? [],
        cities: excludeRegions.cities ?? [],
        district: excludeRegions.district ?? [],
    }
    // 由于需求是仅发省份优先级大于禁发省份所以需要先判断仅发省份
    if (subProvince && subProvince.length) {
        obj.provinces = [];
        regions.forEach((item) => {
            subProvince.forEach((i) => {
                if (item.label === i) {
                    arrList.push(item);
                }
            });
        });
    } else {
       arrList = regions;
    }
    const filefilterRegions = filterRegions(arrList, obj);
    console.log('filefilterRegions',filefilterRegions);
},[])
// 打印后的数据
let regions = [
    {
        label:'河南省',
        children:[
            {
                label:'鹤壁市',
                children:[
                    {label:'淇县'},
                ]
            }
        ]
    },
]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值