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

应用场景是用户在城市列表中想要通过一个关键字去过滤城市,这个城市有省、市层级,该关键字既可以过滤省名也可以过滤市名。如果关键字在市名中有出现,可省名中没有,那么该父级省也要包含在过滤后的数据内。数据结构就类似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:我觉得自己的逻辑写的很糟糕,有没有地方有类似于每日一题的可以练一下简单实用的算法?

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;
});