用于匹配属性名称的速记对象初始值设定项语法

问题描述

有时我发现自己需要使用与另一个对象的属性匹配的属性来初始化一个对象。当属性名称相同时,我希望能够使用速记语法。

(就本问题中的示例而言,我只会将附加属性保留在 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 namesDestructuring 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 属性,并且不会仅仅挑选 unwantedperson 属性

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
  • 如果你有多个不需要的属性,你必须把它们都写在解构中

所以在我看来,你最好按照你在问题中描述的方式去做。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...