一个对象,有多层嵌套,怎么方便的判断某个属性的值

function test(param) {

    let output;
    if(param.a  &&
        param.a.b &&
        param.a.b.c &&
        param.a.b.c.d
        ) {
            output = param.a.b.c.d;
        }
}

比如,我要知道里面parma中的b,那么要经过这样的多层判断

有没有简单一些的方法呢

回复
阅读 6k
7 个回答

这是个好问题,日常编码太多场景要处理这种情况了;显然地,ECMAScript委员会应该也注意到了广大程序员的这个需求,所以同学 ECMAScript最新的语法 optional chaining operator "?." 了解一下,文档传送门:
https://developer.mozilla.org...

function test(param) {

    let output;
    if(param?.a?.b?.c?.d) {
            output = param.a.b.c.d;
    }
}

楼上说的optional chaining operator "?."是一个很好的方法,但是有些地方并不支持新的语法。这些地方你可以尝试使用:

output = param.a && param.a.b && param.a.b.c && param.a.b.c.d

这种连续与的表达式,如果整个表达式结果为真,会返回最后的param.a.b.c.d
image.png
但是需要注意,如果整个表达式返回值为false,会返回第一个false的值:
image.png

lodash不是有个get 方法吗?借鉴下 不过缺点是当字符串传进去的 可以用proxy做层代理 检测某层没有的化返回undefined

我只提供一种思路,经供参考

const param = {
  a: {
    b: {
      c: {
        d: 1,
      },
    },
  },
};

function deepAccess(object, res, defaultValue = "") {
  const attrs = res.split(".");
  try {
    return attrs.reduce((result, prev) => {
      return result[prev];
    }, object);
  } catch (error) {
    return defaultValue;
  }
}

console.log(deepAccess(param, "a.b.s.d", 2))

挖掘呗

export const dig = (obj, targetKey) => {
  if (targetKey in obj) {
    return obj[targetKey]
  } else {
    const innerArrayData = Object.values(obj)
    const finded = innerArrayData.reduce((acc, cur) => {
      if (acc !== undefined) return acc
      if (typeOfData(cur) === '[object Object]') {
        return dig(cur, targetKey)
      }
    }, undefined)
    return finded
  }
}

export const typeOfData = (data) => {
  return Object.prototype.toString.call(data)
}

const param = {
    a: {
        b: {
            c: 11111
        }
    }
}
const result1 = dig(param, 'c') // 11111
const result2 = dig(param, 'n') // undefined
// 比如这是一个后端返回的不完整数据
var data = {
  name: '张三',
};

// 我自己写过一个方案,处理默认数据
// 我明确知道层级关系,比如 data.info.job.id。我需要保证到 job时,这个数据还是 {}
// 然后 就可以肆无忌惮的使用 myData.info.job.id
var myData = ns.dataLayout({
  info: { // info是个键值对
    job: { // job是个键值对。里面有些信息

    }
  }
}, data)

11111111111.png

// 可以试试这个
// 不过有个比较尴尬的问题,就是你的 key 必须是唯一值,
// 如果你的 key 可能存在于多级,或者 value 中就不太靠谱
new RegExp(key)JSON.stringify(params)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏