簡體   English   中英

通過解構或forEach進行縮減-迭代和Airbnb JavaScript樣式指南

[英]Reduce with deconstruction or forEach - Iteration and Airbnb JavaScript Style Guide

我有一個對象:

things = {
  table: 'red',
  chair: 'green'
}

遵循Airbnb的JavaScript樣式指南,我想創建一個復制該對象的函數,將該對象的所有鍵設置為藍色。

我的2個選項似乎是:

1使用reduce

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

2 forEach使用

function alwaysBlue(things) {
  const blueThings = {}
  Object.keys(things)
    .forEach(thing => (blueThings[thing] = 'blue'))
  return blueThings
}

(1)每次迭代的解構似乎很昂貴,但是如果我考慮不使用參數重新分配 ,我就不能在每次迭代時都附加到累加器上

但是,根據https://github.com/ ,應避免使用for(2)來支持map()/ every()/ filter()/ find()/ findIndex()/ reduce()/ some() airbnb / javascript#iterators--不

因此,如果我堅持使用Airbnb的JavaScript樣式指南,那么哪種方法是首選?或者,我是否缺少其他方法?

我想說的一般原則是,你能堅持到您選擇的編碼約定,除非他們強迫你寫下來實現,具有足夠大考慮對性能產生負面影響。 如果真是這樣,那么您將不得不犧牲編碼標准,才能編寫出性能良好的實現。

我不知道您的真實世界數據是什么,但是我敢打賭,#1會做的很好,否則,#2很可能是一個很好的折衷方案。 指南並沒有說forEach 不好 ,但這不是最好的

github問題上回答(這應該是您在本指南上提出疑問的第一個也是唯一的地方):


由於這是無效的語法,因此我假設您的對象是:

   things = {
      table: 'red',
      chair: 'green'
    }

您的第一個示例帶有reduce ,是正確的。 “似乎很昂貴”是您不應該擔心的事情-性能是最不重要的事情,只有在代碼正確,干凈,經過測試和配置文件之后才需要擔心。

只有在最終有必要(通過對應用程序進行完全基准測試而不是像jsperf這樣的微基准測試來確定)時,才可以使用forEach方法,然后,如果仍然有必要,則將其分解for循環。

如果您打算使用mapValues等第三方工具, 可以使用mapValues

_.mapValues(things, () => 'blue');

您可以使用Object.assign ,它不會創建新對象,而只是將項目追加到累加器。 性能會更好,並遵循樣式指南。

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

只需使用一個簡單的死循環:

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

這些迭代方法僅適用於數組,在此不做介紹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM