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

访问嵌套JSON字段报错 接口数据映射前端实现方案

报错原因

你遇到的TypeError: Cannot read properties of undefined (reading 'title')核心原因是:jobs.results是存储了10条职位数据的数组,而非单个职位对象。直接写results.title相当于在数组类型上读取title属性,数组本身不存在这个字段,拿到的是undefined,后续再读取属性就会抛出类型错误。

字段正确访问方式

数组类型的数据必须先通过索引拿到单个职位对象,再读取对象下的字段,或者遍历数组批量处理所有条目:

// 1. 读取单条数据(以第一条、索引为0的数据为例)
const firstJob = jobs.results[0]
const firstJobTitle = firstJob.title // 职位标题
const firstJobLocation = firstJob.location.display_name // 职位显示位置
const firstJobArea = firstJob.location.area // 职位所属区域数组
const firstCompany = firstJob.company.display_name // 招聘公司名

// 2. 批量读取所有数据:遍历数组即可拿到每一条职位对象
jobs.results.forEach((job, index) => {
  console.log(`第${index+1}条职位标题:`, job.title)
})
渲染到页面div的实现示例

以下是原生JS的可直接参考的实现,带了字段兜底逻辑,避免个别字段缺失导致页面渲染报错:
首先准备页面容器:

<div id="job-container" style="max-width: 800px; margin: 20px auto;"></div>

然后写渲染逻辑,在拿到接口返回的jobs数据后调用即可:

function renderJobList(jobs) {
  const container = document.getElementById('job-container')
  // 先做数据合法性校验
  if (!jobs || !Array.isArray(jobs.results)) {
    container.innerHTML = '<p>暂时没有可展示的职位数据</p>'
    return
  }

  // 遍历生成所有职位卡片的HTML
  const jobCards = jobs.results.map(job => {
    // 字段兜底,缺失时显示默认值
    const title = job.title ?? '未命名职位'
    const company = job.company?.display_name ?? '未知招聘方'
    const location = job.location?.display_name ?? '工作地点待确认'
    const workType = job.contract_time ?? '用工类型待确认'
    const publishTime = job.created ? new Date(job.created).toLocaleDateString() : '发布时间未知'
    const desc = job.description ?? '暂无职位描述'
    const jumpUrl = job.redirect_url ?? 'javascript:;'

    return `
      <div class="job-card" style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 16px; margin-bottom: 12px;">
        <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px;">
          <h3 style="margin: 0; font-size: 18px;">
            <a href="${jumpUrl}" target="_blank" style="color: #165DFF; text-decoration: none;">${title}</a>
          </h3>
          <span style="background: #f0f5ff; color: #165DFF; padding: 2px 8px; border-radius: 4px; font-size: 12px;">${workType}</span>
        </div>
        <div style="color: #6b7280; font-size: 14px; margin-bottom: 12px;">
          <span>${company}</span> · <span>${location}</span> · <span>${publishTime}</span>
        </div>
        <p style="margin: 0; color: #374151; font-size: 14px; line-height: 1.6; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;">
          ${desc}
        </p>
      </div>
    `
  }).join('')

  container.innerHTML = jobCards
}

// 接口请求完成后调用渲染方法
// fetchJobs().then(res => renderJobList(res))
注意事项
  • 接口请求是异步逻辑,必须等请求完全返回、拿到完整的jobs对象后再执行渲染和字段读取,不要在请求发起后立刻读取字段,否则会因为数据还没赋值触发同样的undefined错误
  • 示例中用了可选链?.和空值合并运算符??做兼容处理,如果需要兼容IE等老旧浏览器,可以替换为a && a.b && a.b.c的多层判断写法,避免语法报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:57:37