Принудительный метод JavaScript для использования свойства класса вместо свойства текущего объекта в итерации - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть users массив (объектов) внутри класса JavaScript.У каждого пользователя есть свойство isActive.Я создал setUserStatus, предназначенный для изменения указанного свойства у каждого пользователя:

class usersGroupMake {

  constructor() {
  
    this.isGroupActive = true;

    this.groups = {
      groupId: 1,
      users: [{
          firstName: 'John',
          lastName: 'Hopkins',
          isActive: true
        },
        {
          firstName: 'Tim',
          lastName: 'Cook',
          isActive: true
        },
        {
          firstName: 'Marry',
          lastName: 'Smith',
          isActive: true
        }
      ]
    };
    
    this.setUserStatus = function(){
      this.groups.users.forEach(function(user) {
        user.isActive = user.isActive && this.isGroupActive;
      });
    }
  }
}

var userGroup1 = new usersGroupMake();
userGroup1.setUserStatus();
console.log(userGroup1.groups.users);

В этой функции, как вы можете видеть, я пытаюсь использовать свойство isGroupActive моего класса , но, насколько я могувидите, JavaScript пытается идентифицировать isGroupActive как свойство текущего пользователя в итерации .

Что я должен сделать, чтобы иметь возможность использовать this.isGroupActive сверху моего классаinsread?

Примечание: мой вопрос не является дубликатом, он гораздо более конкретен, чем вопрос, обозначенный как дубликат.

Ответы [ 3 ]

4 голосов
/ 24 сентября 2019

Вы можете сделать две вещи:

Во-первых, вы можете сохранить ссылку на this в функции до .forEach():

this.setUserStatus = function(){
  let group = this;
  this.groups.users.forEach(function(user) {
    user.isActive = user.isActive && group.isGroupActive;
  });
}

Во-вторых, вы можете использоватьфункция стрелки:

this.setUserStatus = function(){
  this.groups.users.forEach(user => {
    user.isActive = user.isActive && this.isGroupActive;
  });
}

edit - Я полагаю, что третий способ - воспользоваться API .forEach() и предоставить явный this:

this.setUserStatus = function(){
  this.groups.users.forEach(function(user) {
    user.isActive = user.isActive && this.isGroupActive;
  }, this);
}
2 голосов
/ 24 сентября 2019

Вы можете взять thisArg из Array#forEach.

class usersGroupMake {

  constructor() {
  
    this.isGroupActive = true;

    this.groups = {
      groupId: 1,
      users: [{
          firstName: 'John',
          lastName: 'Hopkins',
          isActive: true
        },
        {
          firstName: 'Tim',
          lastName: 'Cook',
          isActive: true
        },
        {
          firstName: 'Marry',
          lastName: 'Smith',
          isActive: true
        }
      ]
    };
    
    this.setUserStatus = function(){
      this.groups.users.forEach(function(user) {
        user.isActive = user.isActive && this.isGroupActive;
      }, this); // <--
    }
  }
}

var userGroup1 = new usersGroupMake();
userGroup1.setUserStatus();
console.log(userGroup1.groups.users);
0 голосов
/ 24 сентября 2019

Это еще один способ:

class usersGroupMake {
    
      constructor() {
      
        this.isGroupActive = true;
    
        this.groups = {
          groupId: 1,
          users: [{
              firstName: 'John',
              lastName: 'Hopkins',
              isActive: true
            },
            {
              firstName: 'Tim',
              lastName: 'Cook',
              isActive: true
            },
            {
              firstName: 'Marry',
              lastName: 'Smith',
              isActive: true
            }
          ]
        };
        
        this.setUserStatus = function(){
          this.groups.users.map((user)=>{
            user.isActive = user.isActive && this.isGroupActive;
          });
        }
      }
    }
    
    var userGroup1 = new usersGroupMake();
    userGroup1.setUserStatus();
    console.log(userGroup1.groups.users);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...