【问题标题】:Objecy.keys().map() VS Array.map() [closed]Object.keys().map() VS Array.map() [关闭]
【发布时间】:2020-03-21 17:24:48
【问题描述】:

你能告诉我为什么方法 A 比方法 B 更好吗?

方法 A:

const transformCompanyOptions = (companies: Array<{id: string, name: string}>, selectedId: string) => {
  return companies.map(key => {
    return {
      value: key.id,
      label: key.name,
      checked: key.id === selectedId
    }
  })
};

方法 B:

const transformCompanyOptions = (companies: Array<{id: string, name: string}>, selectedId: string) => {
 const ret = Object.keys(companies).map((key) => {
    const newCompany = {};
    newCompany['value'] = companies[key].id;
    newCompany['label'] = companies[key].name;
    if (companies[key].id === selectedId) {
      newCompany['checked'] = true;
    }
    return newCompany;
  });
  return ret;
};

谢谢

【问题讨论】:

  • 为什么要考虑第二个?它进入了一个环形交叉路口(找到键,然后在数组中找到它的值)试图模拟与简单的Array#map 相同的功能。给Array#map 的回调也是纯粹的,它有其隐含的好处。我真的不明白你为什么要去Object.keys() -> map -> 查找任何东西的数组值。
  • 请不要在 JavaScript 部分标记 typescript 代码
  • 有很多方法可以让事情变得更加复杂。并不意味着它们都需要进行比较……
  • 方法 B 只是尝试成为方法 A 的额外步骤。方法 A 使用对象本身来获取值,方法 B 必须使用键,然后找到对象,以获取值。密钥仅作为获取对象的一种方式有用,因此您应该更喜欢从一开始就拥有对象本身的方法。
  • @TKoL 并且如果出于任何原因需要密钥 is,那么您仍然可以从第二个参数获取 if 到 .map 回调。

标签: javascript arrays object javascript-objects


【解决方案1】:

方法 A 是:

  • 更短
  • 不那么冗长
  • 清洁剂
  • 具有更好的性能(您需要首先在方法 B 中通过Object.keys 获取所有密钥)

另外,方法A可以改进:

const transformCompanyOptions = (companies: Array<{id: string, name: string}>, 
    selectedId: string) => {
  return companies.map(c => ({ 
      value: c.id,
      label: c.name,
      checked: c.id === selectedId
    }))
};

正如@TKoL 在 cmets 中所说:

尽量避免将.map 中的参数作为键调用,因为 它实际上是一家公司本身,而不是数组中的 key

【讨论】:

  • 我还建议不要将.map 中的参数称为key,因为它实际上是一家公司本身,而不是数组的键。
  • 您是如何改进方法 A 的?也许我没有看到你对我的版本所做的更改?
  • @Marco 不需要做key =&gt; { return /*...*/ } 而只是做key =&gt; /*...*/
  • @Marco return 声明可以删除
  • @TKoL 感谢您的精彩评论。我已经添加到回复中。 :)
猜你喜欢
  • 2014-08-23
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多