3

我正在运行 eslint,建议在使用箭头函数(lambda 函数)时返回一个值。嗯,这是有道理的。但是,我遇到了一个很难走动的案例。

Dict = {}
Instances = [/* an array of items where items is a dictionary that contains data */]
Instances.map((item) => {
      Dict[item.name] = item.url;
});

我的目标是从 Instances 数组中获取数据并用它填充字典 Dict。我正在使用数组函数将键值对分配给字典,但这违反了箭头函数的规则。

除了 map 之外,是否有任何迭代工具或功能可以帮助我实现目标并避免违反规则?

4

3 回答 3

6

编辑:符合Airbnb 的 ES6 Style Guide


我的目标是从 Instances 数组中获取数据并用它填充字典。

使用.reduce

.. 并且只需将一个空对象作为累加器传递,在您遍历数组时将其填充。

const instances = [
 { name: 'foo', url: 'https://google.com' }, 
 { name: 'bar', url: 'https://stackoverflow.com' }
]

const result = instances.reduce((dict, item) => {
  dict[item.name] = item.url

  return dict
}, {})

console.log(result)

为什么不.map

Array.map总是返回一个新Array的,用于将每个数组元素映射到另一种格式。

如果您生成的数据结构不应该是Array与您正在操作的长度相同的Array,则应避免使用它。

为什么.reduce而不是.forEach

forEach只用于做“工作”而不是转换数据。转换数据几乎总是可以通过 justmap和/或reduce.

这就是我所说的“工作”:

const users = [userInstance, userInstance, userInstance]
users.forEach(user => user.sendEmail('Hello World'))
于 2018-03-07T23:21:23.147 回答
3

使用forEach而不是map.

的重点map是修改数组中的每一项,并将修改后的版本放入新数组中。

forEach只需在每个项目上运行一个函数。

于 2018-03-07T23:19:52.037 回答
0

如果您正在寻找 ES6 解决方案来填充字典对象,这可能会有所帮助并且也应该通过 ESLint:-

const dict = Instances.reduce((map, obj) => (map[obj.name] = obj.url, map), {});

更新

const dict = Instances.reduce((map, obj) => {
  let mapClone = {};
  mapClone = Object.assign({}, map);
  mapClone[obj.name] = obj.url;
  return mapClone;
}, {});
于 2018-03-08T00:13:51.800 回答