You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定格式的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;
}

代码工作流程

  1. 解构赋值:把data里的county、town、postcode和streets单独提出来,避免反复写data.county这种冗余代码。
  2. flatMap处理街道:遍历每条街道,对每条街道的numbers数组做map操作——把每个门牌号和街道名拼接成地址前缀,再加上城镇、郡、邮编组成完整地址。
  3. 自动扁平化: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:39:50