admin管理员组

文章数量:1201353

I'm working with cucumber js and I want to fill out some fields in an application, so i'm using a for-in to get the data from the rowHash but i'm getting the error message "The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype guard-for-in" i'm not sure how I should code my for-in with the if inside the for.

this is my code:

this.fillRequiredfields = function(dataTable){
  var rows = dataTable.rowsHash();
  for (var row in rows) {
    var val = rows[row];

    if (row === 'firstname') {
      element(by.name('firstName')).sendKeys(val).isPresent();
    }
    if (row === 'lastname') {
      element(by.name('lastName')).sendKeys(val).isPresent();
    }
    if (row === 'emailaddress') {
      element(by.name('emailAddress')).sendKeys(val).isPresent();
    }
    if (row === 'displayname') {
      element(by.name('displayName')).sendKeys(val).isPresent();
    }
    if (row === 'password') {
      element(by.name('newPassword')).sendKeys(val).isPresent();
    }
  }
};

So when I try to do the commit in git i'm getting the "guard-for-in" from eslint. If somebody can explain me how I should do the if in the for-in that could be good.

Hope you can help me.

I'm working with cucumber js and I want to fill out some fields in an application, so i'm using a for-in to get the data from the rowHash but i'm getting the error message "The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype guard-for-in" i'm not sure how I should code my for-in with the if inside the for.

this is my code:

this.fillRequiredfields = function(dataTable){
  var rows = dataTable.rowsHash();
  for (var row in rows) {
    var val = rows[row];

    if (row === 'firstname') {
      element(by.name('firstName')).sendKeys(val).isPresent();
    }
    if (row === 'lastname') {
      element(by.name('lastName')).sendKeys(val).isPresent();
    }
    if (row === 'emailaddress') {
      element(by.name('emailAddress')).sendKeys(val).isPresent();
    }
    if (row === 'displayname') {
      element(by.name('displayName')).sendKeys(val).isPresent();
    }
    if (row === 'password') {
      element(by.name('newPassword')).sendKeys(val).isPresent();
    }
  }
};

So when I try to do the commit in git i'm getting the "guard-for-in" from eslint. If somebody can explain me how I should do the if in the for-in that could be good.

Hope you can help me.

Share Improve this question asked Jan 11, 2018 at 20:14 burq24burq24 2991 gold badge5 silver badges18 bronze badges 2
  • 4 The eslint documentation for this rule has an example of correct usage. – CRice Commented Jan 11, 2018 at 20:17
  • Yeah but i don't get what is mean the " if (Object.prototype.hasOwnProperty.call(foo, key)) { doSomething(key); }" – burq24 Commented Jan 11, 2018 at 20:45
Add a comment  | 

4 Answers 4

Reset to default 12

I already solve this, in my case the solution was:

instead of

var val = rows[row];

I add the if with the hasOwnProperty(), like this:

if (rows.hasOwnProperty(row))

So the code is like this:

for (var row in rows) {
  if (rows.hasOwnProperty(row)){

    if (row === 'firstname') {
      element(by.name('firstName')).sendKeys(rows[row]).isPresent();
    }
    if (row === 'lastname') {
      element(by.name('lastName')).sendKeys(rows[row]).isPresent();
    }
    if (row === 'emailaddress') {
      element(by.name('emailAddress')).sendKeys(rows[row]).isPresent();
    }
    if (row === 'displayname') {
      element(by.name('displayName')).sendKeys(rows[row]).isPresent();
    }
    if (row === 'password') {
      element(by.name('newPassword')).sendKeys(rows[row]).isPresent();
    }
  }
}

Hope can help to somebody else.

In some rare cases

if (rows.hasOwnProperty(row))

might trigger undesired effect (for example if this is a function hasOwnProperty()). So this is why suggested method is

Object.prototype.hasOwnProperty.call(rows, row)

You can also use the for...of statement (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of) so your code would be something like:

for (var row of Object.keys(rows)) {
  if (row === 'firstname') {
    element(by.name('firstName')).sendKeys(rows[row]).isPresent();
  }
  [...]
}

Here is another variation of getting around guard-for-in using an array method.

Object.entries(rows).forEach(([key, value]) => {
  if (value === 'firstname') {
    element(by.name('firstName')).sendKeys(val).isPresent();
  }
  // ...
});

本文标签: javascripteslint error quotguardforinquot not clear how to work with forinStack Overflow