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

JavaScript中如何优雅获取高度嵌套JSON对象的指定值?

JavaScript 嵌套对象属性优雅取值方案

首先需要注意:你当前的取值路径存在错误,对照给出的JSON结构,根节点r下第一层即为data节点,不存在第二层嵌套的data,原写法r['data']['data']['relationships']['product']['data']['id']会返回undefined,正确的原生路径为r.data.relationships.product.data.id。

针对多层链式访问冗长、且容易因中间节点为空抛出报错的问题,有以下几种常用优化方案:

1. 可选链操作符(ES2020 原生方案,优先推荐)

可选链?.是JavaScript原生支持的语法,无需引入额外依赖,当访问链路中任意一个节点为null或undefined时,会自动短路返回undefined,不会抛出类型错误,写法简洁可读性高:

const productId = r?.data?.relationships?.product?.data?.id

兼容性说明:现代浏览器、Node.js 14+ 版本全量支持该语法,如果需要兼容IE等老旧环境,可通过Babel做语法转译。

2. 封装通用深度取值工具函数

如果需要兼容不支持可选链的运行环境,或者项目中存在大量深度取值场景,可以封装一个通用的按路径取值函数,支持自定义路径、兜底默认值:

function getDeepVal(obj, path, defaultValue = undefined) {
  const pathSegments = Array.isArray(path) 
    ? path 
    : path.split('.').filter(Boolean)
  let current = obj
  for (const key of pathSegments) {
    if (current === null || current === undefined) return defaultValue
    current = current[key]
  }
  return current === undefined ? defaultValue : current
}

// 使用方式
const productId = getDeepVal(r, 'data.relationships.product.data.id')
// 当属性名包含特殊字符(比如点、横杠)时,可传入数组格式路径
// const productId = getDeepVal(r, ['data', 'relationships', 'product', 'data', 'id'])
// 支持自定义兜底值,比如取不到时返回空字符串
// const productId = getDeepVal(r, 'data.relationships.product.data.id', '')

该方案零依赖、兼容性好,能覆盖绝大多数深度取值场景。

3. 嵌套解构赋值

如果可以100%确定访问链路中所有节点都存在、不会出现空值,也可以使用ES6嵌套解构的方式直接提取目标值:

const { data: { relationships: { product: { data: { id: productId } } } } } = r

如果无法保证节点一定存在,需要给每一层解构加空对象兜底,否则会抛出类型错误,但这种多层兜底的写法可读性较差,不推荐:

const { 
  data: { 
    relationships: { 
      product: { 
        data: { id: productId } = {} 
      } = {} 
    } = {} 
  } = {} 
} = r

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:36:18