js对象取值有没有简写?


obj是后端接收来的,可能为null

只能这样取值吗?

let name = obj && obj.name
阅读 4.3k
7 个回答

可以使用lodash中的get,也可以自己用循环或者递归写一个方法:

这是我前几天实现了一个简单的方案:https://segmentfault.com/q/10...

Object.prototype.getField = function(fields) {
    if (!this || !fields || typeof this!=='object') {
        return null;
    }

    const _fields = fields.split('.');
    let ss = this, field = null;
    let i = 0;

    while(i<_fields.length) {
        field = _fields[i];
        if (field && ss[field]) {
            ss = ss[field]
        } else {
            return null;
        }
        i++;
    }
    return ss;
}

这种写法至今算是比较主流的一种,优点是计算次数比较少,缺点是obj层级太多写起来就麻烦了
最新的ECMA倒是有新的写法提案
let name = obj?.name
只是现在绝部分浏览器不兼容而已

let name = obj.name || '没有值'
|| 遇真返回,如果第一个值为false,返回第二个判断的值

const getter = (target, exec = '_') => {
  return new Proxy({}, {
    get: (o, n) => {
      return n === exec ?
        target :
        getter(typeof target === 'undefined' ? target : target[n], exec)
    }
  })
}

getter(obj.name)._

不是只能这样写么 是不能这样写 因为不知道后端传过来的是什么 obj undefind会报错 还是分别判断好一点

你这个表达式的值只有两种true或者false,因为你这个是布尔运算,不是短路运算

let name = obj && obj.name

建议的写法如下:

if(!obj || !obj.name) {
    return;
}
// 开始正常逻辑

改写法可以有效解决if嵌套太深的问题

引用 lodash.get 吧,目前大型项目里比较实际的方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题