具有递归关系的JavaScript过滤器
我的用例是这样的具有递归关系的JavaScript过滤器,javascript,Javascript,我的用例是这样的 我有一个称为位置的对象数组 它包含有关省、区和市的信息 城市属于一个区,区属于一个省 如果parent\u region\u idnull表示它是一个省 如果parent\u region\u id是一个省的id,则表示它是一个区 否则它就是一座城市 我的目标是从数组中筛选出所有城市。 我做了一个奇怪的方式,但它的工作 但我想知道做这件事的最佳方式是什么? 这是我的工作代码 const位置=[ {id:1,名称:“西部省”,父区\ id:null}, {id:2,名称:“
- 我有一个称为位置的对象数组
- 它包含有关省、区和市的信息李>
- 城市属于一个区,区属于一个省
- 如果
parent\u region\u id
表示它是一个省null
- 如果
是一个省的id,则表示它是一个区parent\u region\u id
- 否则它就是一座城市
const位置=[
{id:1,名称:“西部省”,父区\ id:null},
{id:2,名称:“南部省”,父区\ id:null},
{id:3,名称:“中央省”,父区\ id:null},
{id:4,名称:“科伦坡区”,父区\ id:1},
{id:5,名称:“加勒区”,父区\ id:2},
{id:6,名称:“坎迪区”,父区\ id:3},
{id:7,姓名:“Maharagama”,父区\ id:4},
{id:8,名称:“Nugegoda”,父区\ id:4},
{id:9,姓名:“Peradeniya”,父区id:6},
]
//先拿到省的证件
常数省份=[]
位置。forEach(e=>{
如果(!e.parent\u region\u id){
省份推送(e.id)
}
})
//那就去所有的地区吧
const districts=[]
位置。forEach(e=>{
if(包括省份(例如父区id)){
地区推送(e.id)
}
})
//获得城市
康斯特城市=[];
位置。forEach(e=>
{
如果(!地区包括(e.id)和&!省份包括(e.id)){
console.log(例如name,“is a city”)
}
})
使用和保存
const locations=[{id:1,名称:“西部省”,父区id:null},{id:2,名称:“南部省”,父区id:null},{id:3,名称:“中部省”,父区id:null},{id:4,名称:“科伦坡区”,父区id:1},{id:5,名称:“加勒区”,父区id:2},{id:6,名称:“坎迪区”,父区id:3},名称:“Maharagama”,父区id:4},{id:8,名称:“Nugegoda”,父区id:4},{id:9,名称:“Peradeniya”,父区id:6},]
const res=locations.filter({id,parent\u region\u id},i,a)=>{
如果(!parent_region_id)返回false;
const loc=a.find(l=>l.id==parent\u region\u id);
return!loc.parent\u region\u id?false:true;
});
console.log(res);
如果要使代码更干净、更紧凑,请尝试使用filter()
如下所示:
常数位置=[
{id:1,名称:“西部省”,父区\ id:null},
{id:2,名称:“南部省”,父区\ id:null},
{id:3,名称:“中央省”,父区\ id:null},
{id:4,名称:“科伦坡区”,父区\ id:1},
{id:5,名称:“加勒区”,父区\ id:2},
{id:6,名称:“坎迪区”,父区\ id:3},
{id:7,姓名:“Maharagama”,父区\ id:4},
{id:8,名称:“Nugegoda”,父区\ id:4},
{id:9,姓名:“Peradeniya”,父区id:6},
];
const provides=locations.filter(e=>!e.parent\u region\u id);
const districts=locations.filter(e=>provides.some(p=>p.id==e.parent\u region\u id));
const cities=locations.filter(e=>!provides.includes(e)和&!districts.includes(e));
console.log(省);
控制台.日志(地区);
console.log(城市);