如何解决用于匹配属性名称的速记对象初始值设定项语法
有时我发现自己需要使用与另一个对象的属性匹配的属性来初始化一个对象。当属性名称相同时,我希望能够使用速记语法。
(就本问题中的示例而言,我只会将附加属性保留在 tag: 1
属性中,并且我将在后续示例中重用 message
作为输入/source of the information。我还指出了 unwanted
的额外 message
属性,因为我正在挑选属性,并且不打算仅使用 Object.assign
来分配 { 的所有属性{1}} 到 message
。)
result
要制定上面的 const message = {
person: {
name: 'John'
},unwanted: 'x'
};
let result = { person: message.person,tag: 1 }; // Looking for shorthand for this
对象,我需要键入 result
两次。我在想必须有一种速记方法来做到这一点。我期望它起作用的理由是存在像 ES2015 Shorthand property names 和 Destructuring assignment 这样的特性。例如:
person
这将创建一个名为 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
的 person
属性。
message
所以我目前最好的是 let result = Object.assign({ tag: 1 },message); // Assigns unwanted properties :(
是否有速记初始化语法来实现这一点?
解决方法
目前我拥有的最好的是 { person: message.person,tag: 1 }
。
是否有速记初始化语法来实现这一点?
不,这仍然是他们要走的路。
希望从 person
中神奇地推断出属性名称
let result = { message.person,tag: 1 };
ECMAScript Shorthand Property Assignment Improvements proposal 正好可以实现这一点。不幸的是,它仍处于阶段 0 :-/
,假设您使用的是 ES6:
const message = {
person: {
name: 'John'
},unwanted: 'x'
};
let { unwanted,...result } = { ...message,tag: 1 };
console.log(result);
如果您想将 unwanted
变量重命名为某个名称,请执行以下操作
let { unwanted: dummy,tag: 1 };
这些有一些问题,例如
- 这会创建一个额外的变量
unwanted
(如果您使用第二种方法,则为dummy
) - 如果你有多个不需要的属性,你必须把它们都写在解构中
所以在我看来,你最好按照你在问题中描述的方式去做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。