ESLint | Присвоение свойству параметра функции «полезная нагрузка» - PullRequest
0 голосов
/ 27 июня 2019

У меня есть следующий служебный метод: он удаляет все пустые ключи объекта полезной нагрузки.

Вот код:

const removeEmptyKeysUtil = (payload: any): any => {
  Object.keys(payload).map(
    (key): any => {
      if (payload && payload[key] === '') {
        delete payload[key];
      }
      return false;
    }
  );
  return payload;
};

export default removeEmptyKeysUtil;

Но я получаю следующее сообщение об ошибке:

Присвоение свойству параметра функции 'payload'.eslint (no-param-reassign)

Мне предложили использовать либо object destructuring, либо Object.assign. Но я немного запутался, как это сделать.

Например, destructuring:

      if (payload && payload[key] === '') {
         const {delete payload[key], ...actualPayload} = payload;
      }
      return false;

Но я получаю эту ошибку:

Переменная блока полезной нагрузки, используемая до ее объявления.

Я знаю, я могу отключить правило, но я не хочу этого делать. Я хочу правильно кодировать эту ветку

Можете ли вы помочь мне немного? Я не думаю, что понимаю эти 2 понятия вообще. Спасибо.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Lint предупреждает вас о необходимости выполнить одно из свойств, называемых " immutability ".

Поэтому, когда вы получаете параметр для использования в этой функции (который является объектом), указывает, чтоВы возвращаете из этой функции новый объект с нужными вам изменениями, но это новый объект.

PD: Кроме того, если вы используете Typescript и знаете, что это за полезная нагрузкабыло бы лучше, если бы вы создали интерфейс с его данными, а не присваивали их, потому что они могут помочь вам выбрать внутренние свойства и избежать ошибок, а также ответ, который он возвратит.

OneРешение может быть таким:

const removeEmptyKeysUtil = (payload: any): any =>
  Object.keys(payload)
    .filter(key => payload[key] !== "")
    .reduce((result, key) => ({ ...result, [key]: payload[key] }), {});

export default removeEmptyKeysUtil;
0 голосов
/ 27 июня 2019

Я знаю, что этот ответ, вероятно, не совсем то, что вы искали.Поскольку ваш код плохо работает на сложном объекте, я создал быстрое решение, которое даст желаемый результат.Надеюсь, это поможет.

function isEmptyObject(obj) {
  if (!obj || typeof obj !== 'object') return false;
  if (obj.constructor === Array) return obj.length === 0;
  return Object.keys(obj).length === 0 && obj.constructor === Object;
}

function removeEmptyKeysUtil(obj) {
  if (!obj) return {};
  Object.keys(obj).map(key => {
    // Add additional check here for null, undefined, etc..
    if (obj[key] === '') delete obj[key]; 

    if (obj.constructor === Object) {
      obj[key] = removeEmptyKeysUtil(obj[key])
    }

    if (obj.constructor === Array) {
      for (let i = obj.length; i >= 0; i--) {
        obj[i] = removeEmptyKeysUtil(obj[i])
        if (isEmptyObject(obj[i])) {
          obj.splice(i, 1);
        }
      }
    }

    if (isEmptyObject(obj[key])) {
      delete obj[key];
    }
  })
  return obj;
}

const obj = {
  test: '11',
  test1: '1',
  test2: {
    test: '',
    test1: ''
  },
  test3: [
    {
      test: ''
    },
    {
      test: ''
    },
    {
      test: '3'
    },
    {
      test33: {
        test: '1',
        test1: ''
      }
    }
  ]
};

console.log(removeEmptyKeysUtil(obj))
...