Это две разные проблемы ...
Неожиданная безымянная функция
Это, как указал Константин, правило ESLint func-names .
Если вы не хотите отключать это правило, вы можете использовать имена для своих функций, например:
const farmerIds = a.reduce((function reducer(hash) {
return function fn(prev, curr) {
!hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
return prev;
};
}(Object.create(null))), []);
Или, и это я бы рекомендовал лично, используйтефункции стрелок:
const farmerIds = a.reduce(
(hash => {
return (prev, curr) => {
!hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
return prev;
};
})(Object.create(null)),
[]
);
Ожидается присваивание или вызов функции, и вместо этого он видит выражение
ESLint жалуется на эту строку, которая действительно является выражением, а не выражениемназначение или вызов функции:
!hash[curr.farmerId] && (hash[curr.farmerId] = prev.push(curr));
Вы можете переписать его как оператор if
:
if (!hash[curr.farmerId]) {
hash[curr.farmerId] = prev.push(curr);
}
Исправление обоих
УстановкаПриведенные выше примеры кода вместе, этот код должен выполняться без жалоб ESLint:
const farmerIds = a.reduce(
(hash => (prev, curr) => {
if (!hash[curr.farmerId]) {
hash[curr.farmerId] = prev.push(curr);
}
return prev;
})(Object.create(null)),
[]
);
Обратите внимание, что я также удалил фигурные скобки вокруг тела функции первой стрелки, что является хорошей дополнительной функцией длясохранить код более кратким.