【发布时间】:2021-08-31 12:20:29
【问题描述】:
有时我发现自己需要使用与另一个对象的属性匹配的属性来初始化一个对象。当属性名称相同时,我希望能够使用简写语法。
(出于本问题示例的目的,我将仅将附加属性保留为 tag: 1 属性,我将在后续示例中重用 message 作为信息。我还指出了message 的额外unwanted 属性,因为我正在挑选属性并且不打算仅使用Object.assign 将message 的所有属性分配给result。 em>)
const message = {
person: {
name: 'John'
},
unwanted: 'x'
};
let result = { person: message.person, tag: 1 }; // Looking for shorthand for this
要制定上面的result 对象,我需要输入person 两次。我在想必须有一种速记方法来做到这一点。我期望它起作用的原因是存在ES2015 Shorthand property names 和Destructuring assignment 之类的功能。例如:
const { person } = message; // destructing assignment
let result = { person, tag: 1 }; // shorthand property name for `person`
这将创建一个名为person 的额外变量,其值为message.person,结果将具有一个名为person 的属性,该属性具有所需的值。但是如果没有变量已经存在,那么我不知道在这种情况下如何使用速记。而且我还没有找到将这两个语法特征结合在一起的方法。
这是我对语法的第一个直观猜测:
// hoping destructuring assignment is allowed in object literal
let result = { {person} = message, tag: 1 }; // it is not legal :(
我的第二个猜测是:
// hoping that a property name would magically be inferred from `person`
let result = { message.person, tag: 1 }; // it is not legal :(
作为最后的手段,我尝试了Object.assign,但它复制了unwanted 属性,并且不会只挑选message 的person 属性。
let result = Object.assign({ tag: 1 }, message); // Assigns unwanted properties :(
所以我目前最好的是{ person: message.person, tag: 1 }
是否有速记初始化语法来实现这一点?
【问题讨论】:
标签: javascript object-literal shorthand