miniminixu 2019-03-18 20:49 采纳率: 75%
浏览 1116
已采纳

如何解决这个数组中的过滤问题?

应用场景是用户在城市列表中想要通过一个关键字去过滤城市,这个城市有省、市层级,该关键字既可以过滤省名也可以过滤市名。如果关键字在市名中有出现,可省名中没有,那么该父级省也要包含在过滤后的数据内。数据结构就类似list这样。请问应该怎么写这个逻辑比较优雅。


var  list=[
    {
        provincesName:'zhejiang',
        citys:[
            {cityName:'hangzhou'},
            {cityName:'ningbo'},
        ]
    },
    {
        provincesName:'jiangsu',
        citys:[
            {cityName:'suzhou'},
            {cityName:'nanjing'},
        ]
    },
    {
        provincesName:'hunan',
        citys:[
            {cityName:'changsha'},

        ]
    },
    ...
]


这里关键字暂定为u,那么这个结果就是


var  list=[
    {
        provincesName:'zhejiang',
        citys:[
            {cityName:'hangzhou'},
        ]
    },
    {
        provincesName:'jiangsu',
        citys:[
            {cityName:'suzhou'},
        ]
    },
    {
        provincesName:'hunan',
        citys:[]
    },
    ...
]


我用了一个自己觉得不太优雅的算法去处理:

let listBackUp=[]
let cityBackUp=[]
let haveCity=false

list.forEach((item,i)=>{
    haveCitem=false
    citemBackUp=[]
    item.citys.forEach((citem,ci) => {
        if(citem.cityName.indexOf('u')!=-1{
            cityBackUp.push(citem)
            haveCity=true
        }
    })
    if(haveCity){
        listBackUp.push({...item,city:cityBackUp})
    }else{
        if(item.provincesName.indexOf('u')!=-1{
        listBackUp.push({...item,city:[]})
        }
    }
})

list=listBackUp

ps:我觉得自己的逻辑写的很糟糕,有没有地方有类似于每日一题的可以练一下简单实用的算法?

  • 写回答

1条回答 默认 最新

  • 天际的海浪 2019-03-19 02:07
    关注
    list = list.filter(v=>{
        v.citys = v.citys.filter(w=>w.cityName.indexOf("u")!=-1);
        return v.provincesName.indexOf("u")!=-1 || v.citys.length>0;
    });
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?