Javascript 如何在Array.prototype.reduce()函数中处理eslint no param重新分配规则

Javascript 如何在Array.prototype.reduce()函数中处理eslint no param重新分配规则,javascript,ecmascript-6,eslint,Javascript,Ecmascript 6,Eslint,我最近添加了eslint规则 但是,当我使用构建一个对象(空对象为initialValue)时,我发现自己需要在每次回调迭代中修改累加器(回调函数的第一个参数),这会导致无参数重新分配linter投诉(正如人们所期望的那样) const newObject=['a','b','c'].reduce((结果、项目、索引)=>{ result[item]=index;//好的,您可以执行(result,item)=>Object.assign({},result,{[item]:whatever})

我最近添加了eslint规则

但是,当我使用构建一个对象(空对象为
initialValue
)时,我发现自己需要在每次回调迭代中修改
累加器(回调函数的第一个参数),这会导致
无参数重新分配
linter投诉(正如人们所期望的那样)

const newObject=['a','b','c'].reduce((结果、项目、索引)=>{
result[item]=index;//好的,您可以执行
(result,item)=>Object.assign({},result,{[item]:whatever})
在每次迭代中创建一个新对象:-)


如果你想欺骗linter,你可以使用Object.assign(result,{[item]:whatever})
(它的作用与你当前的代码相同,但没有明确的赋值),但是我想你应该简单地禁用这个规则。

一个解决方案是利用


性能警告!!这是一个应该避免的错误。

我只是将reduce函数包装在lint rule disable块中,即:

/* eslint-disable no-param-reassign */
const newObject = ['a', 'b', 'c'].reduce((result, item, index) => {
  result[item] = index;
  return result;
}, {});
/* eslint-enable no-param-reassign */

每当我使用
Array.prototype.reduce
时,我总是将“acculator”参数命名为
accu
。此约定方便地允许我设置eslint规则:

“无参数重新分配”:[
“错误”,
{
“道具”:没错,
“IgnorePropertyModifications for”:[“accu”]
}
],

如果您对此参数有自己的命名约定,请将上述规则中的“accu”替换为您使用的任何名称,eslint不会抱怨修改累加器。

注意,这是因为您通过了
“props”:true
规则。默认情况下,它不会对此进行抱怨。如果您不希望出现这种行为,似乎将其设置为
false
是您想要的?或者使用
//eslint disable line no param reassign标记它。
这是一个好主意@loganfsmyth。我将重新检查是否设置了“props”这是我们真正想要的…顺便说一句,在这个主题上有一个很好的对话,是的,这是我想的。也许禁用该行的规则是最好的选择…这真的是一个很好的解决方案吗?减少一个包含许多元素的数组,比如说2000个,将创建尽可能多的新对象实例,就像本例中的2000个。@Amida是的,这是一个很好的解决方案非常无性能的解决方案-因为您可能有非常大的阵列。而不仅仅是使用新的(单个)对象:每一次迭代都在创建一个非常慢的新对象。正如前面所说的,这不是性能。您应该禁用该行中的LILT规则。也许,要求ESLLT用户考虑为Array.reduceThis添加一个异常应该是性能原因的正确答案。临时解决方案。无参数重新分配是防止我们在范围外产生副作用的一种方法,但是Array.reduce的情况是副作用问题的一个例外,因为它在内部是纯的。
const newObject = ['a', 'b', 'c'].reduce((result, item, index) => ({
  ...result,
  [item]: index, 
}), {});
/* eslint-disable no-param-reassign */
const newObject = ['a', 'b', 'c'].reduce((result, item, index) => {
  result[item] = index;
  return result;
}, {});
/* eslint-enable no-param-reassign */