@pcdesign

Как в данном коде победить ошибку ESLint Assignment to property of function parameter 'acc'. (no-param-reassign)?

var msg = {
  "a": {
    'category': [{
      "id": 1, "cat_name": 'aaa'
    }, {
      "id": 2, "cat_name": 'bbb'
    }]},
  "d": {
    'category': [{
      "id": 3, "cat_name": 'ccc'
    }, {
      "id": 4, "cat_name": 'ddd'
    }]},
  "v": {
    'category': [{
      "id": 5, "cat_name": 'eee'
    }]}
};

var items = Object.values(msg).reduce((acc, curr) => {
  curr.category.forEach(item => (acc[item.id] = item.cat_name));
  return acc;
}, {});

console.log('items', items);

Вот что выдает:
{1: "aaa", 2: "bbb", 3: "ccc", 4: "ddd", 5: "eee"}

Код выдает то что я хочу получить, но редактор ругается на "ESLint Assignment to property of function parameter 'acc'. "
Игнорировать ошибку с помощью /*eslint no-param-reassign: "error"*/ - не хотелось бы.
  • Вопрос задан
  • 10567 просмотров
Решения вопроса 2
Krasnodar_etc
@Krasnodar_etc
fundraiseup
var items = Object.values(msg).reduce((acc, curr) => {
  const result = { ...acc };
  curr.category.forEach(item => (result[item.id] = item.cat_name));
  return result;
}, {});
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Во-первых, там где осознано нарушаются правила линта, указать это служебным комментарием линтера не так, уж и плохо.

Но все же есть 2 способа обойтись без комментария:

1. Просто затыкаем линтер, но по сути делаем то же самое, то есть мутируем аргумент acc, но по хитрому:
var items = Object.values(msg).reduce((acc, curr) => {
  curr.category.forEach(item => Object.assign(acc, {[item.id]: item.cat_name}));
  return acc;
}, {});


2. пишем действительно иммутабельно, ловим небольшой оверхед по производительности, зато получаем более надежное решение:
const items = Object.values(msg).reduce(
  (acc, curr) => Object.assign({}, acc, curr.category.reduce(
    (acc, item) => Object.assign({}, acc, {[item.id]: item.cat_name}),
  {})),
{});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Lynn
@Lynn
nginx, js, css
Либо игнорировать, либо переписать без reduce на forEach, например. По хорошему, второе даже лучше и будет понятнее.
Ответ написан
Комментировать
@beshot
Object.defineProperties(msg, {
  getFlat: {
    get() {
      Object.values(msg).forEach(item => {
        item.category.forEach(value => {
          this.items[value.id] = value.cat_name
        })
      })
      return this.items
    },
  },
  items: {
    writable: true,
    value: {},
  },
})

console.dir(msg.getFlat)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы