如何使用reduce处理嵌套对象数组,筛选ICD主诊断数据?
从React项目的对象数组中提取主诊断ICD数据
我正在开发一个React项目,需要从对象数组中提取所需信息。数组中的每个条目包含Person字段,该字段下嵌套了Icds数组,其中存在标记为IsLeading=true的主诊断数据。我需要通过filter或reduce方法处理这个数组,要么得到仅包含主诊断ICD数据的数组,要么生成原数组的精简版——保留原条目结构,但仅保留每个条目中IsLeading=true的ICD数据。
示例数据
{"_id": "611cd9eae20bd167a796f884","BeforeAccJob": "Antennenbauer/-in","FuneralCost": 6,"FuneralCostWithSeverancePay": false,"FuneralCostSeverancePayDuration": 1,"FuneralCostDynamisationRate": 0.025,"FuneralCostCapitalisationRate": 0.025,"FuneralCostCostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"Miscellaneous": 300000.5,"MiscellaneousWithSeverancePay": false,"MiscellaneousSeverancePayDuration": 1,"MiscellaneousCapitalisationRate": 0.025,"MiscellaneousDynamisationRate": 0.025,"MiscellaneousCostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationEntity","Person": {"_id": "P30081568","Firstname": "Nick","Lastname": "Fury","Birthday": "1976-10-10T00:00:00.000Z","MaritalStatus": "NotSet","Icds": [{"_id": 85071,"Mk": 3,"Code": "S72.0","ActineoText": "Schenkelhalsfraktur","Text": "Schenkelhalsfraktur","Status": "assured","IsLeading": false,"__typename": "ProcessICD"},{"_id": 85072,"Mk": 2,"Code": "T01.9","ActineoText": "Multiple offene Wunden, nicht näher bezeichnet","Text": "Multiple offene Wunden, nicht näher bezeichnet","Status": "assured","IsLeading": false,"__typename": "ProcessICD"},{"_id": 85073,"Mk": 3,"Code": "T08.0","ActineoText": "Fraktur der Wirbelsäule","Text": "Fraktur der Wirbelsäule, Höhe nicht näher bezeichnet: geschlossen","Status": "assured","IsLeading": false,"__typename": "ProcessICD"},{"_id": 85074,"Mk": 1,"Code": "J93.9","ActineoText": "Pneumothorax","Text": "Pneumothorax, nicht näher bezeichnet","Status": "assured","IsLeading": false,"__typename": "ProcessICD"},{"_id": 634234,"Mk": 1,"Code": "Z96.64","ActineoText": "Vorhandensein einer Hüftgelenkprothese","Text": "Vorhandensein einer Hüftgelenkprothese","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 634235,"Mk": 1,"Code": "M87.95","ActineoText": "Knochennekrose, nicht näher bezeichnet: Beckenregion und Oberschenkel","Text": "Knochennekrose, nicht näher bezeichnet: Beckenregion und Oberschenkel","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387916,"Mk": 3,"Code": "S32.01","ActineoText": null,"Text": "Fraktur eines Lendenwirbels: L1","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387917,"Mk": 3,"Code": "S32.02","ActineoText": null,"Text": "Fraktur eines Lendenwirbels: L2","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 610262,"Mk": 3,"Code": "S12.24","ActineoText": "Fraktur des 6. Halswirbels","Text": "Fraktur des 6. Halswirbels","Status": "unknown","IsLeading": true,"__typename": "ProcessICD"},{"_id": 387909,"Mk": 3,"Code": "S72.3","ActineoText": null,"Text": "Fraktur des Femurschaftes","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387908,"Mk": 4,"Code": "S71.88","ActineoText": null,"Text": "Weichteilschaden II. Grades bei offener Fraktur oder Luxation der Hüfte und des Oberschenkels","Status": "unknown","IsLeading": true,"__typename": "ProcessICD"},{"_id": 385884,"Mk": 1,"Code": "S71.1","ActineoText": null,"Text": "Offene Wunde des Oberschenkels","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387911,"Mk": 3,"Code": "S82.18","ActineoText": null,"Text": "Fraktur des proximalen Endes der Tibia: Sonstige","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387910,"Mk": 3,"Code": "S81.88","ActineoText": null,"Text": "Weichteilschaden II. Grades bei offener Fraktur oder Luxation des Unterschenkels","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 385887,"Mk": 1,"Code": "S81.0","ActineoText": null,"Text": "Offene Wunde des Knies","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 385888,"Mk": 3,"Code": "S82.38","ActineoText": null,"Text": "Distale Fraktur der Tibia: Sonstige","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 385889,"Mk": 3,"Code": "S82.5","ActineoText": null,"Text": "Fraktur des Innenknöchels","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387905,"Mk": 3,"Code": "S61.87","ActineoText": null,"Text": "Weichteilschaden I. Grades bei offener Fraktur oder Luxation des Handgelenkes und der Hand","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387906,"Mk": 2,"Code": "S62.31","ActineoText": null,"Text": "Fraktur eines sonstigen Mittelhandknochens: Basis","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387907,"Mk": 2,"Code": "S63.2","ActineoText": null,"Text": "Multiple Luxationen der Finger","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387912,"Mk": 3,"Code": "S82.31","ActineoText": null,"Text": "Distale Fraktur der Tibia: Mit Fraktur der Fibula (jeder Teil)","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387913,"Mk": 3,"Code": "S22.44","ActineoText": null,"Text": "Rippenserienfraktur: Mit Beteiligung von vier und mehr Rippen","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387914,"Mk": 3,"Code": "S22.20","ActineoText": null,"Text": "Fraktur des Sternums: Nicht näher bezeichnet","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"},{"_id": 387918,"Mk": 2,"Code": "D62","ActineoText": null,"Text": "Akute Blutungsanämie","Status": "unknown","IsLeading": false,"__typename": "ProcessICD"}],"__typename": "Person"},"Blocks": [{"Name": "PropertyDamageCost","IsRounded": false,"Coefficient": 1,"Sum": 1390,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "HealingTreatmentCost","IsRounded": false,"Coefficient": 1,"Sum": 200,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "IncomeCost","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": null,"SeverancePayDuration": null,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "HousekeepingDamageCost","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "IncreasedNeeds","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "DamageCost","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "SurvivorsPensionCost","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"},{"Name": "MaintenanceDamageCost","IsRounded": false,"Coefficient": 1,"Sum": 0,"WithSeverancePay": false,"SeverancePayDuration": 1,"CapitalisationRate": 0.025,"DynamisationRate": 1,"CostSharingAgreement": {"Active": false,"Rate": 1,"Limit": 0,"Unlimited": false,"__typename": "CostSharingAgreement"},"__typename": "CalculationBlock"}]}
解决方案
方法1:提取所有主诊断ICD数据
如果只需要所有条目中的主诊断ICD对象,可以用flatMap配合filter:
const leadingIcds = originalArray.flatMap(item => item.Person.Icds.filter(icd => icd.IsLeading === true) );
或者用reduce实现:
const leadingIcds = originalArray.reduce((acc, item) => { const leading = item.Person.Icds.filter(icd => icd.IsLeading); return [...acc, ...leading]; }, []);
方法2:生成精简版原数组(保留结构,仅留主诊断Icds)
如果需要保留原数组的条目结构,但仅保留每个条目中的主诊断ICD数据,可以用map配合对象解构:
const simplifiedArray = originalArray.map(item => ({ ...item, Person: { ...item.Person, Icds: item.Person.Icds.filter(icd => icd.IsLeading === true) } }));
这种方式会创建原数组的副本,每个条目里的Person.Icds只包含IsLeading=true的诊断数据,其他字段保持不变。
内容的提问来源于stack exchange,提问作者LaFllamme
相关产品推荐
相关产品推荐

