【问题标题】:Destructuring an object into another object将一个对象解构为另一个对象
【发布时间】:2025-12-21 07:50:06
【问题描述】:

我正在尝试将我的代码更新为 es6。 除了这一部分,我将所有其他代码都更新为 es6 语法。 我了解解构的主要概念(也许?), 但我不知道如何对这段代码进行解构(const userData 部分)。 我想让这段代码更简洁。

$scope.doRegister = (registerForm) => {
  const userData = {
    emailAddress: $scope.registerData.email,
    password: $scope.registerData.password,
    firstName: $scope.registerData.first,
    lastName: $scope.registerData.last
  };
  userService.registerUser(userData)
  .then((userData) => {
    $ionicHistory.nextViewOptions({ historyRoot: true });
    $state.go('app.deviceSetup');
  })
  .catch((err) => {
    console.error(err);
  });
}

【问题讨论】:

  • 你想通过解构来完成什么?我们需要知道你想用它做什么。
  • 让代码更干净,主要是把代码从es5更新到es6。我更新了其他部分,但有点难以理解和使用解构。我想在 const userData 部分使用解构功能
  • 请将该信息添加到您的问题中,以便阅读该问题的人更好地了解您要做什么。您已经对“不清楚您在问什么”(不是来自我)投了近一票,所以您的问题需要更清楚。
  • 感谢 jfriend00!我编辑了我的帖子。我不知道这足以理解......我是一名初级开发人员,仍在学习所以如果你能指出或帮助任何东西都会很棒!
  • 所以...您想使用解构来更改对象的属性名称。

标签: angularjs ecmascript-6 destructuring


【解决方案1】:

您实际上是在尝试将$scope.registerData“解构”成一个新对象userData。但是解构只支持解构到变量,而不是对象。因此,你可以写:

const {
  email:    emailAddress, 
  password, 
  first:    firstName, 
  last:     lastName
} = $scope.registerData;

const userData = {emailAddress, password, firstName, lastName};

上面的第一行是解构;第二行使用“速记属性表示法”来构建新对象。

关于如何解构成一个新对象,这里有很多关于 SO 的建议和许多问题,但没有简单、明显的方法来做到这一点。最接近的可能是使用object rest syntax,它只有在您知道要省略哪些属性、不允许重命名、会创建额外变量dontNeed1 等时才有效,并且可能有也可能没有本机浏览器支持.

const {...userData, dontNeed1, dontNeed2} = ...$scope.registerData;

在这种情况下,完全不尝试使用解构和/或使用@BrianMcCutchon 的方法,这当然是一个可行的选择,甚至可能更可取。

【讨论】:

  • 感谢虎三郎!这对我很有帮助,因为我想看到改变的方式,无论它是最好的方式还是不是。并感谢您的意见和解释。我现在将尝试应用您的代码。看看会发生什么以及我的整个代码。谢谢!
【解决方案2】:

我不认为解构是做到这一点的正确方法。但是,还有其他方法可以清理此代码。最简单的是将$scope.registerData保存到一个临时变量中:

const rd = $scope.registerData
const userData = {
  emailAddress: rd.email,
  password: rd.password,
  firstName: rd.first,
  lastName: rd.last
};

别误会,你可以使用解构,但你最终不得不在某处重复字段名称。这样更干净。

【讨论】:

  • 我完全理解你的建议。但我必须在这里应用解构。对不起,我让你混淆了。不过非常感谢您的回答!
  • @moniqueyj 我不认为你“必须”改变它。这是代码审查中的建议吗?如果是这样,您可以回答“解构在这里不起作用,因为......”并包括 torazaburo 的回答中提到的原因。您甚至可以回复此主题的链接。
  • 太棒了。感谢 Brian 的所有帮助和 cmets。你为我所做的一切,对我来说都是宝藏!祝你晚安:)