【问题标题】:ESLint | Assignment to property of function parameter 'payload'ESLint |分配给函数参数“有效负载”的属性
【发布时间】:2019-11-09 06:40:01
【问题描述】:

我有以下实用方法:它删除有效负载对象的所有空键。

代码如下:

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;

但我收到以下 eslint 错误:

分配给函数参数'payload'.eslint(no-param-reassign)的属性

有人建议我使用object destructuringObject.assign。但我对如何做到这一点有点困惑。

例如destructuring:

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

但我收到此错误:

在声明之前使用的块范围变量“payload”。

我知道,我可以禁用该规则,但我不想这样做。我想正确编码该分支

你能帮帮我吗?我认为我根本不理解这两个概念。谢谢。

【问题讨论】:

    标签: reactjs typescript object eslint object-destructuring


    【解决方案1】:

    我知道这个答案可能不是您想要的。由于您的代码在复杂的对象上表现不佳,我创建了一个快速解决方案,它将给出您想要的结果。希望对你有帮助。

    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))

    【讨论】:

      【解决方案2】:

      Lint 警告您要满足称为“immutability”的属性之一。

      因此,当您收到要在此函数中使用的参数(它是一个对象)时,表明您从该函数返回的是一个新对象,并带有您想要的修改,但这是一个新的对象。

      PD:此外,如果您使用 Typescript 并且知道该有效负载是由什么组成的,那么最好使用其数据创建一个接口而不是分配任何数据,因为它可以帮助您选择内部属性并避免错误,以及它将返回的响应。

      一个解决方案可能是这样的:

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

      【讨论】:

      • 你在这里的建议是返回给我同样的错误 result。对于您的建议,我有一个更简单的解决方案,它可以正常工作,但是您是否有一个不会重组我现有代码的解决方案..
      • @DimitrisEfst ,我很抱歉对其进行了重组,我已经纠正了一些让我处于中间状态的东西,我试图让它变得简单,用最少的行可能的。你能给我们你的解决方案,以便我们看看吗? :)
      猜你喜欢
      • 2020-05-10
      • 2018-05-20
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多