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

Angular15中如何将多地址转换为独立地址对象数组

Angular 15 地址数据转换代码修正

需求说明

需要将给定JSON数据中每个ProfileName对应的多组地址(取自LicenseInfo中的AddressLine1-4、City、State、Zip字段)转换为包含name和address的独立对象数组,预期每个非空的AddressLine对应一个独立地址对象。

预期结果

[
  {name:'Pharmarx Pharmaceutical Inc', address:'21441 Osborne St Ste C & D, Canoga Park, CA, 91304'},
  {name:'Pharmarx Pharmaceutical Inc', address:'441 abc address, Canoga Park, CA, 91304'},
  {name:'Pharmarx Pharmaceutical Inc', address:'231 osborne, Canoga Park, CA, 91304'},
  {name:'Pharmarx Pharmaceutical Inc', address:'987 osborne, Canoga Park, CA, 91304'}, 
  {name:'ENCINO PHARMACY_AKA MDR PHARMACEUTICAL CARE', address:'17071 VENTURA BLVD STE 100, ENCINO, MI, 91316'},
  {name:'Encino Pharmacy_aka Mdr Pharmaceutical Care', address:'17059-17071 VENTURA BLVD., ENCINO, CA, 91316'},
  {name:'Encino Pharmacy_aka Mdr Pharmaceutical Care', address:'STE. 100, ENCINO, CA, 91316'},
  {name:'Abdin Pharmacies Pharma LLC', address:'1873 SECOND AVE. NEW, YORK, FL, 10029'},
  {name:'Abdin Pharmacies Pharma LLC', address:'1401 BRONX RIVER AVE., BRONX, FL, 10472'},
  {name:'Abdin Pharmacies Pharma LLC', address:'32866 US Hwy 19N, PALM HARBOR, FL, 34684'},
  {name:'PHARMALABS, LLC PharmaLabs', address:'10901 ROOSEVELT BOULEVARD NORTH SUITE 1200, Saint Petersburg, FL, 33716'}
]

原始JSON数据

{
  "took": 178,
  "timed_out": false,
  "_shards": {
    "total": 0,
    "successful": 0,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 12.9226,
    "hits": [
      {
        "_index": "pulse",
        "_id": "17320",
        "_score": 12.9226,
        "_source": {
          "ProfileName": "Pharmarx Pharmaceutical Inc",
          "BusinessModel": "Dispenser",
          "LicenseInfo": [
            {
              "LicenseType": "Resident Licensed Sterile Compounding",
              "LicenseNumber": "99658",
              "AddressLine1": "21441 Osborne St Ste C & D",
              "AddressLine2": "441 abc address",
              "AddressLine3": "231 osborne",
              "AddressLine4": "",
              "Zip": "91304",
              "City": "Canoga Park",
              "State": "CA"
            },
            {
              "LicenseType": "Retail Pharmacy",
              "LicenseNumber": "50511",
              "AddressLine1": "21441 Osborne St Ste C & D",
              "AddressLine2": "987 osborne",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "91304",
              "City": "Canoga Park"
            }
          ]
        }
      },
      {
        "_index": "pulse",
        "_id": "7723",
        "_score": 10.891928,
        "_source": {
          "ProfileName": "ENCINO PHARMACY_AKA MDR PHARMACEUTICAL CARE",
          "State": "MI",
          "BusinessModel": "Dispenser",
          "LicenseInfo": [
            {
              "LicenseType": "PHARMACY",
              "LicenseNumber": "5301010993",
              "AddressLine1": "17071 VENTURA BLVD STE 100",
              "AddressLine2": "",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "91316",
              "City": "ENCINO"
            }
          ]
        }
      },
      {
        "_index": "pulse",
        "_id": "7724",
        "_score": 9.796367,
        "_source": {
          "ProfileName": "Encino Pharmacy_aka Mdr Pharmaceutical Care",
          "State": "CA",
          "BusinessModel": "Dispenser",
          "LicenseInfo": [
            {
              "LicenseType": "Retail Pharmacy",
              "LicenseNumber": "34818",
              "AddressLine1": "17059-17071 VENTURA BLVD.",
              "AddressLine2": "STE. 100",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "91316",
              "City": "ENCINO"
            }
          ]
        }
      },
      {
        "_index": "pulse",
        "_id": "192",
        "_score": 9.656487,
        "_source": {
          "ProfileName": "Abdin Pharmacies Pharma LLC",
          "State": "FL",
          "BusinessModel": "Dispenser",
          "LicenseInfo": [
            {
              "LicenseType": "Pharmacy",
              "LicenseNumber": "036936",
              "AddressLine1": "1873 SECOND AVE. NEW",
              "AddressLine2": "",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "10029",
              "City": "YORK"
            },
            {
              "LicenseType": "Pharmacy",
              "LicenseNumber": "033404",
              "AddressLine1": "1401 BRONX RIVER AVE.",
              "AddressLine2": "",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "10472",
              "City": "BRONX"
            },
            {
              "LicenseType": "Pharmacy",
              "LicenseNumber": "PH33043",
              "AddressLine1": "32866 US Hwy 19N",
              "AddressLine2": "",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "34684",
              "City": "PALM HARBOR"
            }
          ]
        }
      },
      {
        "_index": "pulse",
        "_id": "17304",
        "_score": 9.186218,
        "_source": {
          "ProfileName": "PHARMALABS, LLC PharmaLabs",
          "State": "FL",
          "BusinessModel": "Dispenser",
          "LicenseInfo": [
            {
              "LicenseType": "Pharmacy",
              "LicenseNumber": "PH26495",
              "AddressLine1": "10901 ROOSEVELT BOULEVARD NORTH SUITE 1200",
              "AddressLine2": "",
              "AddressLine3": "",
              "AddressLine4": "",
              "Zip": "33716",
              "City": "Saint Petersburg"
            }
          ]
        }
      }
    ]
  }
}

当前代码及问题

当前TypeScript代码:

results = searchData.hits;
if (results.hits.length > 0) {
  results.hits.forEach(h => {
    let item = h._source;
    item.LicenseInfo.forEach(ap => {
      let address = `${ap.AddressLine1} ${ap.AddressLine2} ${ap.AddressLine3} ${ap.AddressLine4} ${ap.City} ${item.State} ${ap.Zip}`;
      let addresses = { name: item.ProfileName, address }
      data = data.concat(addresses);
    })
    this.seeResultsData = data;
    return data;
  })
  return null;
}

问题分析:

  1. 将单个LicenseInfo中的所有AddressLine拼接成一个地址,而非每个非空AddressLine生成独立对象;
  2. 地址拼接时未过滤空字符串,导致出现多余空格;
  3. State取值逻辑错误:未优先使用LicenseInfo内的State字段,部分数据的State在LicenseInfo中而非_source;
  4. 地址格式不符合预期,缺少必要的逗号分隔。

修正后的代码

// 初始化结果数组
const data: { name: string; address: string }[] = [];
const results = searchData.hits;

if (results.hits.length > 0) {
  results.hits.forEach(h => {
    const item = h._source;
    // 遍历每个LicenseInfo条目
    item.LicenseInfo.forEach(ap => {
      // 提取当前LicenseInfo中的地址行,过滤空值
      const addressLines = [
        ap.AddressLine1,
        ap.AddressLine2,
        ap.AddressLine3,
        ap.AddressLine4
      ].filter(line => line && line.trim() !== '');
      
      // 确定State:优先用LicenseInfo里的,没有则用_source里的
      const state = ap.State || item.State;
      // 拼接地址后缀(City, State, Zip)
      const addressSuffix = [ap.City, state, ap.Zip]
        .filter(part => part && part.trim() !== '')
        .join(', ');

      // 每个非空地址行生成一个独立对象
      addressLines.forEach(line => {
        const fullAddress = `${line.trim()}, ${addressSuffix}`;
        data.push({ 
          name: item.ProfileName, 
          address: fullAddress 
        });
      });
    });
  });
  
  this.seeResultsData = data;
}

修正后输出说明

修正后的代码会:

  • 遍历每个LicenseInfo中的AddressLine1-4,过滤掉空字符串;
  • 每个非空的AddressLine与对应的City、State、Zip拼接成规范格式的地址;
  • 为每个地址生成独立的{name, address}对象,最终结果完全符合预期格式。

内容的提问来源于stack exchange,提问作者Bhrungarajni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:47:01