将对象解构为另一个对象

时间:2017-05-06 00:53:30

标签: angularjs ecmascript-6 destructuring

我正在尝试将我的代码更新为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);
  });
}

2 个答案:

答案 0 :(得分:3)

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

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

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

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

这里有关于如何构建新对象的提议和许多问题,但没有简单明了的方法可以做到这一点。你最接近的可能就是使用object rest syntax,只有当你知道想要省略哪些属性,不允许重命名,创建额外的变量dontNeed1等时,它才会起作用,可能会也可能不会有原生浏览器支持。

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

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

答案 1 :(得分:3)

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

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

不要误解我,你可以使用解构,但你最终不得不在某处复制字段名称。这更清洁了。