如何将指定格式的JavaScript对象转换为完整地址数组?
解决地址数据转完整地址字符串数组的问题
嘿,这个嵌套数据的处理其实用JavaScript的flatMap就能很优雅地搞定,完全不用纠结多层forEach的麻烦!我给你捋清楚思路和代码:
首先,你的数据结构是邮政编码 -> 多条街道 -> 每个街道多个门牌号,我们需要把每个门牌号和对应街道、城镇、郡、邮编拼接成完整地址,最后合并成一个数组。flatMap刚好适合这种“嵌套数组转一维数组”的场景,它会先对每个元素做map操作,再把结果扁平化。
完整实现代码
function populateAddresses(data) { // 先解构出需要的字段,让代码更清晰 const { county, town, postcode, streets } = data; // 用flatMap处理每条街道,再用map处理每个门牌号 const fullAddresses = streets.flatMap(street => { return street.numbers.map(addressNumber => { // 按照要求的格式拼接地址 return `${addressNumber.buildingNumberOrName} ${street.name}, ${town}, ${county}, ${postcode}`; }); }); console.log(JSON.stringify(fullAddresses)); return fullAddresses; }
代码工作流程
- 解构赋值:把data里的
county、town、postcode和streets单独提出来,避免反复写data.county这种冗余代码。 - flatMap处理街道:遍历每条街道,对每条街道的
numbers数组做map操作——把每个门牌号和街道名拼接成地址前缀,再加上城镇、郡、邮编组成完整地址。 - 自动扁平化:
flatMap会把每条街道生成的地址数组合并成一个一维数组,刚好就是你要的结果。
对比你提到的方法
- 用
forEach的话,你需要手动创建一个空数组,然后在两层循环里push地址字符串,代码会显得繁琐,而且容易出错。 - 单独用
map的话,会得到“每个街道对应一个地址数组”的二维数组,还需要额外用flat()来扁平化,不如flatMap一步到位。
测试示例数据
把你给的测试数据传进去:
const testData = { "county": "WEST MIDLANDS", "town": "SOLIHULL", "streets": [ { "name": "MARSLAND ROAD", "numbers": [ { "buildingNumberOrName": "1", "buildingName": "", "subBuildingName": "", "buildingNumber": "1" }, { "buildingNumberOrName": "3", "buildingName": "", "subBuildingName": "", "buildingNumber": "3" } ] } ], "postcode": "B92 7BU" }; populateAddresses(testData);
会输出:["1 MARSLAND ROAD, SOLIHULL, WEST MIDLANDS, B92 7BU","3 MARSLAND ROAD, SOLIHULL, WEST MIDLANDS, B92 7BU"]
完全符合你的要求!
如果以后有多个街道的情况,比如第二条街道有5个门牌号,这个代码也能自动把所有地址都合并到同一个数组里,不用改任何逻辑~
内容的提问来源于stack exchange,提问作者katie hudson
相关产品推荐
相关产品推荐

