【问题标题】:Es6: Short version for destructuringEs6:解构的简短版本
【发布时间】:2018-08-28 16:45:00
【问题描述】:

有没有办法把下面的代码写得更短一点?

const { user } = JWT.verify(req.params.token, keys.secretOrKey);
const { email } = user;

我只需要来自 JWT 的 email 属性。

JWT.verify()返回的数据是一个Object:

user: {
    name: 'the name',
    email: 'email@address.com',
    ...
}

【问题讨论】:

  • 试试const { email } = JWT.verify(req.params.token, keys.secretOrKey).user;

标签: javascript ecmascript-6 destructuring


【解决方案1】:

是的,你可以写

const {user:{email}} = JWT.verify(req.params.token, keys.secretOrKey);

let test = { user: {
    name: 'the name',
    email: 'email@address.com'
    }}

const {user:{email}} = test;

console.log("user",typeof user);
console.log("email",email)

如您所见,仅设置了emailuser 未定义。

但请注意,这仅在定义 user 时才有效,否则将引发错误。

您还可以为user 对象设置默认值,如下所示:

let test = {/** user: {
    name: 'the name',
    email: 'email@address.com'
    }**/}

const {user:{email}={}} = test;

console.log("user",typeof user);
console.log("email",email)

如果没有定义user,它不会抛出错误

【讨论】:

  • 关于必须定义user 的注意事项。也许最好指出如何在故障安全的同时将user 默认为空对象?
  • 嘿@chazsolo 我希望这就是你的意思,直到现在我还没有真正听说过这是可能的^^
  • 是的,没错!也可以同时获取user作为对象:const { user, user: { email } = {} } = test
  • 虽然这似乎不是 OP 想要的
  • 不,只是表明解构不受这种限制。你现在得到的是一个很好的答案。
【解决方案2】:

如 cmets 中所述:

const myFunction = {
  user: {
    name: 'the name',
    email: 'email@address.com'
  }
}

const {
  email
} = myFunction.user

console.log(email)

【讨论】:

  • 每个人都因为标题而直接进行了更多的解构,但这更容易阅读(在我看来)。嵌套解构既尴尬又令人困惑。
【解决方案3】:

解构赋值相当强大:

// shim for example
const JWT = { verify: () => ({
  user: {
    email: 'me@me.me',
    name: 'snek',
  }, 
}) };

///////////////////

const { user: { email } } = JWT.verify();

console.log(email);

注意这里没有声明user

在此处查看更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2019-02-04
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多