ESLint не позволяет в

у меня есть объект

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: циклы for..in перебирают всю цепочку прототипов, что практически никогда не является тем, что вам нужно. Используйте Object.{keys,values,entries} и выполните итерацию по результирующему массиву. (без ограничений синтаксиса

Как мне отредактировать мой код?


person user7334203    schedule 05.05.2017    source источник
comment
Попробуйте for(const key of currentValues.keys()), если вам нужны только ключи. Вы можете использовать entries, если вам нужны ключи и значения.   -  person Andrew Li    schedule 05.05.2017
comment
@AndrewLi, ты говоришь о Object.keys()? Если это так, это все равно будет сомнительно, так как итерация по массиву с for ... in не одобряется.   -  person Pointy    schedule 05.05.2017
comment
@Pointy Я использую for...of?   -  person Andrew Li    schedule 05.05.2017
comment
Ой извините, продолжайте :) Но все же; для этого объекта нет функции .keys().   -  person Pointy    schedule 05.05.2017
comment
Я не вижу массив.   -  person James    schedule 05.05.2017
comment
Если for in было ужасно, почему они не могут его осудить ????   -  person Naren    schedule 12.01.2020


Ответы (7)


Он говорит,

Используйте Object.{keys,values,entries} и выполните итерацию по результирующему массиву.

So you could do something like this to get the object keys as an array and then loop through the keys to make necessary changes.

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

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

person rishipuri    schedule 05.05.2017
comment
да, но я не понимаю, почему? Может действительно проблема? - person Madeo; 28.05.2020
comment
Как это может быть более интуитивным или коротким, чем старый добрый for in? - person Jonny; 10.11.2020
comment
@Jonny for..in будет проходить через всю цепочку прототипов, как поясняется в сообщении ESLint, так что в итоге вы получите неожиданные элементы в своем цикле. Чтобы избежать этого, люди добавляли if (Object.prototype.hasOwnProperty.call...) внутрь цикла for..in (см. пример кода OP). Использование Object.keys устраняет необходимость в этом if внутри for..in, это намного чище и проще, чем использование for..in. - person Alisson; 20.06.2021

Я использовал следующее:

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.

person user7334203    schedule 05.05.2017

Вы можете получить массив всех ваших значений внутри вашего объекта, просто выполнив

var myValuesInArray = Object.values(currentValues);
person quirimmo    schedule 05.05.2017

Я знаю, что это похоже на приведенное выше, но вот полный пример:

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,
  });
 }
}
person Andres Felipe    schedule 14.03.2019
comment
hasOwnProperty не требуется при использовании Object.keys(): stackoverflow.com/questions/29004314/ - person Charles L.; 02.03.2021

попробуйте это вместо этого:

Object.keys(currentValues).map(key => (yield put(setCurrentValue(key, currentValues[key]))));
person Daher    schedule 17.07.2019

Я бы сделал это путем рефакторинга следующими способами.

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

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

Результаты:

эй: 1212 гит: 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 гит: 1212 нмо: 12121

person OnlyZero    schedule 10.05.2021

Использование for...in будет перебирать все свойства, включая свойства из прототипа объекта. Я не уверен, почему вы делаете Object.prototype.hasOwnProperty.call(currentValues, key), а не просто: currentValues.hasOwnProperty(key). Я думаю, это должно дать ESLint понять, что вы фильтруете только собственные свойства.

Однако я предлагаю использовать for (const key of Object.keys()), что более семантично.

person jakow    schedule 05.05.2017
comment
лучше использовать hasOwnPrototype(..) из Object. см. eslint.org/docs/rules/no-prototype-builtins - person ronapelbaum; 12.06.2017