将一个对象解构为另一个对象

Destructuring an object into another object

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

您实质上是在尝试 "destructure" $scope.registerData 进入一个新对象 userData。但是解构只支持解构为变量,不支持对象。因此,你可以这样写:

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

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

上面第一行是解构;第二行使用 "shorthand property notation" 构建新对象。

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

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

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

我认为解构不是执行此操作的正确方法。但是,还有其他方法可以清理此代码。最简单的就是把$scope.registerData保存到一个临时变量:

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

不要误会我的意思,您可以使用解构,但您最终不得不在某处重复字段名称。这个更干净。