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

如何高效处理React+NextJS中接口返回的缺失字段JSON对象?

优化React+NextJS中缺失字段的数据处理方案

我正在使用React结合NextJS进行Web开发,需在页面渲染列表,列表数据通过axios的get请求从服务器获取。但部分返回的JSON对象存在name、address等字段缺失的情况,目前我使用if-else语句处理不同的JSON对象,代码如下:

getPatientList(currentPage).then((res: any) => {
  console.log("Response in ini: " , res);
  //console.log(res[0].resource.name[0].given[0]);
  const data: any = [];
  res.map((patient: any) => {
    if ("name" in patient.resource) {
      let info = {
        id: patient.resource.id,
        //name:"test",
        name: patient.resource.name[0].given[0],
        birthDate: patient.resource.birthDate,
        gender: patient.resource.gender,
      };
      data.push(info);
    } else {
      let info = {
        id: patient.resource.id,
        name: "Unknow",
        //name: patient.resource.name[0].given[0],
        birthDate: patient.resource.birthDate,
        gender: patient.resource.gender,
      };
    data.push(info);
  }
});

作为TypeScript和React新手,想请教是否有更巧妙高效的解决方案?


1. 用可选链+空值合并简化字段处理

直接用?.处理深层嵌套的可选字段,??设置默认值,不用写冗余的if-else,还能避免name存在但name[0]或given[0]缺失导致的报错:

getPatientList(currentPage).then((res: any) => {
  console.log("Response in ini: ", res);
  const data = res.map((patient: any) => ({
    id: patient.resource.id,
    name: patient.resource.name?.[0]?.given?.[0] ?? "Unknown",
    birthDate: patient.resource.birthDate,
    gender: patient.resource.gender,
  }));
  // 后续用data渲染列表
});

2. 定义TypeScript类型,替代any

用类型定义约束数据结构,既能获得代码提示,也能在编译阶段发现潜在问题:

// 定义Patient相关类型
interface PatientName {
  given: string[];
}

interface PatientResource {
  id: string;
  name?: PatientName[];
  birthDate?: string;
  gender?: string;
}

interface PatientItem {
  resource: PatientResource;
}

// 使用类型替代any
getPatientList(currentPage).then((res: PatientItem[]) => {
  console.log("Response in ini: ", res);
  const data = res.map((patient) => ({
    id: patient.resource.id,
    name: patient.resource.name?.[0]?.given?.[0] ?? "Unknown",
    birthDate: patient.resource.birthDate,
    gender: patient.resource.gender,
  }));
});

3. 提取处理函数,提升代码复用性

如果后续还有其他地方需要处理Patient数据,可以把转换逻辑抽成单独函数:

const formatPatientData = (patient: PatientItem) => ({
  id: patient.resource.id,
  name: patient.resource.name?.[0]?.given?.[0] ?? "Unknown",
  birthDate: patient.resource.birthDate,
  gender: patient.resource.gender,
});

getPatientList(currentPage).then((res: PatientItem[]) => {
  console.log("Response in ini: ", res);
  const data = res.map(formatPatientData);
});

4. 统一处理其他缺失字段

如果birthDate、gender也可能缺失,同样可以用空值合并给默认值:

const formatPatientData = (patient: PatientItem) => ({
  id: patient.resource.id,
  name: patient.resource.name?.[0]?.given?.[0] ?? "Unknown",
  birthDate: patient.resource.birthDate ?? "未填写",
  gender: patient.resource.gender ?? "未知",
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:35:24