使用解构或forEach减少-迭代和Airbnb JavaScript样式指南

使用解构或forEach减少-迭代和Airbnb JavaScript样式指南,javascript,iterator,reduce,airbnb,eslint-config-airbnb,Javascript,Iterator,Reduce,Airbnb,Eslint Config Airbnb,我有一个目标: things = { table: 'red', chair: 'green' } 遵循Airbnb的JavaScript风格指南,我想创建一个复制此对象的函数,将对象的所有键设置为蓝色 我的两个选择似乎是: 1使用减少 2使用forEach 1每次迭代的解构似乎都很昂贵,但如果我要考虑到这一点,我不能只在每次迭代中附加累加器 然而,根据研究,forEach 2应该避免使用map/each/filter/find/findIndex/reduce/some 那么,如果我

我有一个目标:

things = {
  table: 'red',
  chair: 'green'
}
遵循Airbnb的JavaScript风格指南,我想创建一个复制此对象的函数,将对象的所有键设置为蓝色

我的两个选择似乎是:

1使用减少

2使用forEach

1每次迭代的解构似乎都很昂贵,但如果我要考虑到这一点,我不能只在每次迭代中附加累加器

然而,根据研究,forEach 2应该避免使用map/each/filter/find/findIndex/reduce/some


那么,如果我要遵守Airbnb的JavaScript风格指南,那么哪种方法是首选方法?还是我缺少另一种方法?

只需使用一个简单的死循环:

function alwaysBlue(things) {
  const blueThings = {}
  for (const key in things) // or `for (const key of Object.keys(things))`
    blueThings[key] = 'blue'
  return blueThings
}

这些迭代方法只适用于数组,这不是我们在这里处理的。

< P>我会说一般的准则是,你可以坚持选择的编码惯例,除非它们强迫你编写对性能有负面影响的实现,这是大到足以考虑的。如果是这样的话,那么为了编写性能足够好的实现,您必须对编码标准做出必要的牺牲

我不知道你的真实数据是什么,但我打赌1会很好,如果不是,那么2很可能是一个很好的折衷方案。指南没有说forEach不好,只是不是最好的。

回答了关于本指南的问题,您应该首先也是唯一的地方:

由于这是无效语法,我假设您的对象是:

   things = {
      table: 'red',
      chair: 'green'
    }
使用reduce的第一个示例是正确的。似乎昂贵是您不应该担心的事情——性能是最不重要的事情,只需要在代码正确、干净、经过测试和分析之后才需要关心


只有当通过对应用程序进行全面基准测试(而不是通过jsperf等微基准测试)确定它是必要的时,您才会使用forEach方法,如果仍然有必要,您会将其转移到for循环中。

如果您准备使用第三方工具,例如可以使用mapValues:

您可以使用Object.assign,它不创建新对象,而只是将该项附加到累加器中。更好的性能,并遵守风格指南

Object.keys(things)
    .reduce((acc, thing) => Object.assign(acc, {[thing]: 'blue' }), {})

该对象有语法错误。请修复它。请解释这有什么问题,或者它如何不符合样式指南。我没有否决,但他们特别提到必须避免for in或for of。@plalx样式指南说,首选,而不是必须避免。因为in和Object.keys…forEach…做的事情完全一样,但它更简单,可读性更强,速度更快,而且更明显的是身体被用于突变。这并不重要,因为蓝色作为一个整体仍然是纯净的。但是,是的,当一个人不关心二次复杂度并且对实验性语法很好时,纯reduce解决方案就是最好的选择。然而,我没有投反对票,因为..in在附带的eslint设置中被标记为受限语法:message:'for..in循环在整个原型链上迭代,这实际上从来都不是你想要的。使用对象。{keys,values,entries},并在结果数组上进行迭代。'),上面到11.1的链接还声明不使用迭代器。。。使用Object.keys/Object.values/Object.entries生成数组,以便可以在对象上迭代。
   things = {
      table: 'red',
      chair: 'green'
    }
_.mapValues(things, () => 'blue');
Object.keys(things)
    .reduce((acc, thing) => Object.assign(acc, {[thing]: 'blue' }), {})