【问题标题】:Lint issue with for loopfor循环的lint问题
【发布时间】:2021-05-10 01:30:39
【问题描述】:

以下逻辑按预期工作。我无法更改 lint 规则。
data 在这种情况下只是一个对象,如下所示。

const testData = {
  item_one: 'item',
};

这是接收上述数据的函数

const convert = (data) => {
  for (const key in data) {
      // ...
  }
  return data;
};

为我的 for 循环获取如下 lint 错误,如下所示:

  1. for..in 循环遍历整个原型链,这实际上绝不是您想要的。使用 Object.{keys,values,entries},并遍历生成的数组
  2. for-in 的主体应包含在 if 语句中,以过滤原型中不需要的属性

为了解决第一个问题,尝试将循环切换为 foreach 类型,如下所示并解决了 lint。
但是由于某种原因,这打破了我的逻辑......由于 lint 导致逻辑中断有点令人沮丧。

data.forEach((previousKey) => {
    // ... same logic as above inside that loop loop
}

对于第 2 点,我确实想遍历每个属性。我该如何解决这个 lint 错误?

请指教。谢谢。

【问题讨论】:

    标签: javascript eslint


    【解决方案1】:

    只有数组有forEach 方法; data.forEach 不起作用,因为 data 不是数组。你需要这个

    data.forEach((previousKey) => {
    

    成为

    Object.keys(data).forEach((previousKey) => {
    

    或者,如果你也想要关联的值

    Object.entries(data).forEach(([previousKey, value]) => {
    

    对于第 2 点,我确实想遍历每个属性。

    我认为您也不会故意迭代 inherited 属性。你真的在内部原型上有属性吗,例如

    const obj = Object.create({ foo: 'bar' });
    obj.someProp = 'someVal';
    

    ,并且您想遍历foo 和someProp?

    这听起来很不寻常——可能,但很奇怪。这就是 linter 警告您不要使用 for..in 的原因。如果您确实需要迭代继承的属性,请禁用这一行的 linter 规则(最好,因为这会使代码最简单),或者(更冗长)迭代自己的 -实例对象的属性使用Object.keys,然后对实例的原型执行相同的操作,依此类推,直到到达原型链的末尾。

    【讨论】:

    • 对于迭代中的第 2 点,我只关心对象中的键值。 item_one、item_two 等等。
    • 如果是这种情况,那么您实际上并不想遍历原型链中的每个属性,这是 linter 警告您的 - 所以,如果您继续使用 @987654332 @,首先检查实例本身是否具有被迭代的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2013-07-14
    • 2012-09-20
    • 2018-12-15
    相关资源
    最近更新 更多