如何在Array.prototype.reduce()函数中处理eslint no-param-reassign规则

时间:2017-01-13 00:17:16

标签: javascript ecmascript-6 eslint

我最近添加了eslint规则no-param-reassign

但是,当我使用reduce构建一个对象(空对象为initialValue)时,我发现自己需要在每个对象上修改accumulator(第一个回调函数)回调迭代,导致no-param-reassign linter投诉(正如人们所期望的那样)。

const newObject = ['a', 'b', 'c'].reduce((result, item, index) => {
  result[item] = index; // <-- causes the no-param-reassign complaint
  return result;
}, {});

是否有更好的方法来构建一个不会修改reduce参数的accumulator对象?

或者我应该只在我的reduce回调函数中禁用该行的linting规则?

4 个答案:

答案 0 :(得分:10)

我正在重新审视此问题,以便使用object spread operator发布最终发生在我身上的新答案...

const newObject = ['a', 'b', 'c'].reduce((result, item, index) => ({
  ...result,
  [item]: index, 
}), {});

答案 1 :(得分:9)

好吧,你可以(result, item) => Object.assign({}, result, {[item]: whatever})在每次迭代时创建一个新对象: - )

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

答案 2 :(得分:2)

每当我使用 Array.prototype.reduce 时,我总是将“累加器”参数命名为 accu。这个约定方便我设置我的 eslint 规则:

    "no-param-reassign": [
      "error",
      {
        "props": true,
        "ignorePropertyModificationsFor": ["accu"]
      }
    ],

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

答案 3 :(得分:1)

我只是将reduce函数包装在lint规则禁用块中,即:

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