首页 > 解决方案 > 为什么我不能使用模板文字在新对象中创建字符串作为键?

问题描述

我有一些对象数组,其中有一个示例对象

{
    id: 10,
    name: "Clementina XYZ",
    username: "Moriah.Stanton",
    email: "foo.bar@quux.biz",
    address: {
      street: "Kattie Turnpike",
      suite: "Suite 555",
      city: "Lebsackbury",
      zipcode: "31428-2261",
      geo: {
        lat: "-38.2386",
        lng: "57.2232"
      }
    },
    phone: "555-648-3804",
    website: "example.com",
    company: {
      name: "Acme LLC",
      catchPhrase: "Centralized empowering task-force",
      bs: "target end-to-end models"
    }
  }

我还有一个功能可以很好地找到与它们user相同的 scompany.namemap在它们之上创建具有,和的对象nameaddressphone

function buildCompanyDirectory(company, directory) {
  return directory
    .filter(user => user.company.name === company)
    .map(({ name, address, phone }) => ({
      name,
      address,
      phone
    }));
}

现在,一个新任务:

// TODO: Build an Array of company directories

所以,我希望有一个由 s 组成的最终数组,这些 s 是从 s和s的对象数组派生而来user.company.name的。所以,像:nameaddressphone

[{
  "Hoeger LLC": [{ }]
}]

作为解决这个问题的一部分,我觉得(显然 JS 不同意!)我应该能够使用模板文字来使用从另一个对象的派生的 s创建新对象

该非工作代码如下所示:

const directories = users.map((user) => {
  return {
    `${user.company.name}` : buildCompanyDirectory(company.name, users) // ERROR: Property assignment expected
  };
});

看来我不需要求助于Object.keys()或类似的东西。这感觉更像是某种类型的“语法”错误或只是错误的符号。

当然,我想知道解决这个问题的最简单方法!谢谢。

标签: arraysecmascript-6

解决方案


问题是对象文字中的键构造在 JS 中是特殊情况。您可以使用文字字符串或裸标识符。

为了允许表达式作为对象字面量中的键,JS 使用以下 hack:

const a = 'aaaa';
const data = {[`this_is_${a}`]: 10}
data.this_is_aaaa === 10; // true.

其中的表达式[]将被评估并用作键。


推荐阅读