Недавно я добавил правило eslint no-param-reassign.

Тем не менее, когда я использую reduce чтобы создать объект (пустой объект как initialValue), мне нужно модифицировать accumulator (первый аргумент функции обратного вызова) на каждой итерации обратного вызова, что вызывает {{X3} } жалоба Линтера (как и следовало ожидать).

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

Есть ли лучший способ создать объект с reduce, который не изменяет аргумент accumulator?

Или я должен просто отключить правило linting для этой строки в моих функциях обратного вызова reduce?

52
sfletche 13 Янв 2017 в 03:17

3 ответа

Лучший ответ

Я просто обертываю функции 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 */
16
Zack Knopp 2 Авг 2019 в 17:21

Ну, вы могли бы сделать (result, item) => Object.assign({}, result, {[item]: whatever}) для создания нового объекта на каждой итерации :-)

Если вы хотите обмануть линтера, вы можете использовать => Object.assign(result, {[item]: whatever}) (который делает то же самое, что и ваш текущий код, но без явного назначения), но да, я думаю, вам следует просто отключить это правило.

11
Bergi 13 Янв 2017 в 00:26

Одним из решений может быть использование оператора распространения объекта

const newObject = ['a', 'b', 'c'].reduce((result, item, index) => ({
  ...result,
  [item]: index, 
}), {});
23
sfletche 13 Дек 2019 в 18:21