5

我正在尝试使用对象解构来提取变量,但这些变量已经存在,就像这样

const x=1, y=2 // Those should be 1 and 2
const {x,y} = complexPoint
const point = {x,y}

有没有办法在不重命名解构变量的情况下做到这一点?像这样和更新点避免const定义?

const point = {x,y} = complexPoint

预期的结果应该是使用对象解构

const x=1, y=2 // Those should be 1 and 2
const point = {
  x:complexPoint.x,
  y:complexPoint.y
}
4

3 回答 3

9

您可以通过数组解构来做到这一点,即:

const complexPoint = [1,2];

let x, y;
[x,y] = complexPoint;

至于对象解构,等效语法不起作用,因为它会抛出解释器:

const complexPoint = {x:1,y:2};

let x, y;
{x,y} = complexPoint; // THIS WOULD NOT WORK

一种解决方法可能是:

const complexPoint = {x:1,y:2};

let x, y;
[x,y] = [complexPoint.x, complexPoint.y];

// Or
[x,y] = Object.values(complexPoint);

更新:

看来您可以通过将赋值包装在括号中并将其转换为表达式来将对象解构为现有变量。所以这应该工作:

const complexPoint = {x:1,y:2};

let x, y;
({x,y} = complexPoint); // THIS WILL WORK
于 2019-12-19T20:22:22.200 回答
3

在这里可以这样做。

const complexPoint = {x: 1, y: 2, z: 3};
const simplePoint = ({x, y}) => ({x, y});

const point = simplePoint(complexPoint);

console.log(point);

在一行中看起来像这样:

const complexPoint = {x: 1, y: 2, z: 3};

// can be written as
const point2 = (({x, y}) => ({x, y}))(complexPoint);

console.log(point2);

于 2019-12-19T20:13:40.280 回答
1

我不是 100% 清楚你想做什么。

如果您想使用以下point两个属性进行更新complexPoint

您实际上可以将对象解构为任何可分配的对象。大多数情况下,您将解构为变量,但您也可以解构为属性

例子:

const point = {x: 1, y: 2};
const otherPoint = {x:3, y: 4};

   ({x: point.x, y: point.y} = otherPoint);
// ^                                     ^
// parenthesis are necessary otherwise the runtime will interpret {
// as the start of a block

console.log(point);

当然,您拥有的属性越多,阅读起来就越困难。您也可以直接分配它们,这是一种很好的老式方式:

point.x = otherPoint.x;
point.y = otherPoint.y;

或使用循环:

for (const prop of ['x','y']) {
  point[prop] = otherPoint[prop];
}

如果要从现有对象创建新对象

创建一个辅助函数以从现有对象中“挑选”属性。这里提供了这样的功能。

const point = pick(otherPoint, 'x', 'y');
于 2019-12-19T21:00:10.877 回答