ESLint 不允许

ESLint doesn't allow for in

提问人:RamAlx 提问时间:5/5/2017 最后编辑:JJJRamAlx 更新时间:8/25/2022 访问量:77732

问:

我有一个对象

currentValues= {hey:1212, git:1212, nmo:12121}

我是这样使用的:

for (const key in currentValues) {
    if (Object.prototype.hasOwnProperty.call(currentValues, key)) {
        yield put(setCurrentValue(key, currentValues[key]));
    }
}

ESLint 向我显示一个错误,上面写着:

ESLint:为了..循环遍历整个原型链,这几乎从来都不是你想要的。使用 Object。{keys,values,entries},并遍历生成的数组。(无限制语法

我应该如何编辑我的代码?

JavaScript eslint for-in-loop

评论

2赞 Andrew Li 5/5/2017
如果您只需要密钥,请尝试。如果需要键和值,可以使用。for(const key of currentValues.keys())entries
0赞 Pointy 5/5/2017
你在说什么@AndrewLi?如果是这样,那将是值得怀疑的,因为遍历数组是不受欢迎的。Object.keys()for ... in
1赞 Andrew Li 5/5/2017
@Pointy我正在使用?for...of
0赞 Pointy 5/5/2017
哎呀,对不起,继续:)但仍然;该对象上没有函数。.keys()
2赞 Naren 1/12/2020
如果很糟糕,为什么他们不能弃用它 😡for in

答:

0赞 jakow 5/5/2017 #1

using 将遍历所有属性,包括对象原型中的属性。我不确定你为什么要这样做,而不仅仅是:. 我认为这应该让 ESLint 意识到您只过滤自己的属性。for...inObject.prototype.hasOwnProperty.call(currentValues, key)currentValues.hasOwnProperty(key)

但是,我建议使用 ,这更具语义性。for (const key of Object.keys())

评论

0赞 ronapelbaum 6/12/2017
使用 from 更好。查看 eslint.org/docs/rules/no-prototype-builtinshasOwnPrototype(..)Object
4赞 quirimmo 5/5/2017 #2

您可以获取对象中所有值的数组

var myValuesInArray = Object.values(currentValues);
85赞 rishipuri 5/5/2017 #3

它说,

使用 Object。{keys,values,entries},并遍历生成的 数组。

因此,您可以执行类似操作以数组形式获取对象键,然后遍历键以进行必要的更改。

currentValues= {hey:1212, git:1212, nmo:12121}

Object.keys(currentValues).forEach(function(key) {
  yield put(setCurrentValue(key, currentValues[key]));
})

评论

4赞 Matteo 5/28/2020
是的,但我不明白为什么?这真的是一个问题吗?
4赞 Jonny 11/10/2020
这怎么能比普通的旧更直观或更简短呢?for in
3赞 Alisson Reinaldo Silva 6/20/2021
正如 ESLint 消息所解释的那样,@Jonny将遍历整个原型链,因此您最终会在循环中获得意想不到的项目。为了避免这种情况,人们会在循环中添加一个内部代码(参见 OP 代码示例)。使用消除了内部的需要,它比使用更干净、更直接。for..inif (Object.prototype.hasOwnProperty.call...)for..inObject.keysiffor..infor..in
3赞 Jan Jarčík 9/22/2021
“yield”表达式只允许在生成器主体中使用
14赞 RamAlx 5/5/2017 #4

我使用了以下内容:

const keys = Object.keys(currentValues);
const values = Object.values(currentValues);
for (let i = 0; i < keys.length; i += 1) {
    yield put(setCurrentValue(keys[i], values[i]));
}

这是正确的,没有 ESLint 错误。

3赞 Andres Felipe 3/15/2019 #5

我知道它与上述类似,但这里有一个完整的例子:

const data = res.data;
const keys = Object.keys(data);
const values = Object.values(data);

for (let i = 0; i <= keys.length; i += 1) {
  if (Object.prototype.hasOwnProperty.call(values, i)) {
     this.rows.push({
        name: values[i].name,
        email: values[i].email,
        address: values[i].address,
        phone: values[i].phone,
        role: values[i].role,
  });
 }
}

评论

1赞 Charles L. 3/2/2021
hasOwnProperty如果使用:stackoverflow.com/questions/29004314/...Object.keys()
2赞 Daher 7/18/2019 #6

试试这个:

Object.keys(currentValues).map(key => (yield put(setCurrentValue(key, currentValues[key]))));
5赞 OnlyZero 5/10/2021 #7

我会通过以下方式进行重构来做到这一点。

const currentValues = { hey: 1212, git: 1212, nmo: 12121 };

Object.keys(currentValues).forEach((e) => console.log(`${e} : ${currentValues[e]}`));

结果:

嘿 : 1212 GIT :1212 编号 : 12121

Object.values(currentValues).forEach((e) => console.log(`Values: ${e}`));

结果:

(2)值: 1212 值: 12121

Object.entries(currentValues).forEach((e) => console.log(`${e[0]} : ${e[1]}`));

结果:

嘿 : 1212 GIT :1212 编号 : 12121

4赞 Parth shah 8/25/2022 #8

let animal = {
  eats: "Eating",
};
let rabbit = {
  jumps: "Jumping",
};

rabbit.__proto__ = animal;

for (const rabbitProps in rabbit) {
  // This will print both eats and jumps properties because they're part of
  // prototype chain
  console.log("rabbitProps: ", rabbitProps);
}

// This prints only jumps as Object.keys shows only the keys of object
console.log(Object.keys(rabbit));

查看上面的代码,您可以看到,当使用 for...in loop[ 它将显示作为对象一部分的所有属性以及对象的原型链中设置的属性,因此 eslint 建议使用 Object.keys 或值或条目,因为它们不查看原型链,而只是查看您的对象。