是否可以将对象解构为现有变量?

Is it possible to destructure an object into existing variables?

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

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
}

这里可以这样操作

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);

你可以用数组解构来做到这一点,即:

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

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

如果你想用complexPoint

的两个属性更新point

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

示例:

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];
}

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

创建辅助函数以 "pick" 现有对象的属性。提供了这样的功能here.

const point = pick(otherPoint, 'x', 'y');

解构后,可以使用解构后的数据,将其作为对象保存到另一个变量中。

如果我们有这个对象:

const obj={"property":"value","property2":"value"};

您可以像这样从中解构数据:

const {property}=obj;

如果我们只想将解构后的数据分配给另一个变量,我们会这样做:

const newVariable ={property};

现在 newVariable 值将等于:

{"property":"value"}