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; }
问题分析:
- 将单个
LicenseInfo中的所有AddressLine拼接成一个地址,而非每个非空AddressLine生成独立对象; - 地址拼接时未过滤空字符串,导致出现多余空格;
State取值逻辑错误:未优先使用LicenseInfo内的State字段,部分数据的State在LicenseInfo中而非_source;- 地址格式不符合预期,缺少必要的逗号分隔。
修正后的代码
// 初始化结果数组 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
相关产品推荐
相关产品推荐

