【问题标题】:Shorthand object initializer syntax for matching property name用于匹配属性名称的速记对象初始值设定项语法
【发布时间】:2021-08-31 12:20:29
【问题描述】:

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

(出于本问题示例的目的,我将仅将附加属性保留为 tag: 1 属性,我将在后续示例中重用 message 作为信息。我还指出了message 的额外unwanted 属性,因为我正在挑选属性并且不打算仅使用Object.assignmessage 的所有属性分配给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 namesDestructuring 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 属性,并且不会只挑选messageperson 属性。

let result = Object.assign({ tag: 1 }, message);  // Assigns unwanted properties :(

所以我目前最好的是{ person: message.person, tag: 1 }

是否有速记初始化语法来实现这一点?

【问题讨论】:

    标签: javascript object-literal shorthand


    【解决方案1】:

    到目前为止,我最好的是{ person: message.person, tag: 1 }

    是否有速记初始化语法来实现这一点?

    不,这仍然是他们要走的路。

    希望从person 神奇地推断出属性名称

    let result = { message.person, tag: 1 };
    

    ECMAScript Shorthand Property Assignment Improvements proposal 正好允许这样做。不幸的是,它仍处于第 0 阶段:-/

    【讨论】:

      【解决方案2】:

      假设您使用的是 ES6:

      const message = {
        person: {
          name: 'John'
        },
        unwanted: 'x'
      };
      
      let { unwanted, ...result } = { ...message, tag: 1 };
      
      console.log(result);
      

      如果您想将 unwanted 变量重命名为某个名称,请修改

      let { unwanted: dummy, ...result } = { ...message, tag: 1 };
      

      这些有一些问题,例如

      • 这会创建一个额外的变量unwanted(或dummy,如果您使用第二种方法)
      • 如果您有多个不需要的属性,则必须将它们全部写入解构中

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

      【讨论】:

      • 这不是挑选所需的属性。您已经精心挑选了一个不需要的属性。想象一下,有几十个不需要的属性——它们都必须被单独知道和命名。
      • 是的,我在回答中提到了这个缺点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2022-10-04
      • 2011-08-01
      • 2011-09-30
      • 2015-06-25
      • 2018-11-06
      • 2018-07-08
      相关资源
      最近更新 更多