Razvan Zamfir
Razvan Zamfir

Reputation: 4626

Why does my JavaScript setter not change object property as expected?

I have users array (of objects) inside a JavaScript object. Every user has an isActive property:

let groups = {
  groupId: 0,
  userRights: {
    users: [{
      name: 'John',
      isActive: true
    },
    {
      name: 'Marry',
      isActive: true
    }
  ]},
  set userStatus(user) {
    this.userRights.users.forEach(function(user) {
      // On this condition, change users statuses
      if(parseInt(this.groupId) !== 1){
       user.isActive = false;
      }
    });
  },
}

console.log(groups.userRights.users);

I was expecting my setter to change every user's isActive proprty to false so I could see it in the console already changes.

What am doing wrong?

Upvotes: 0

Views: 73

Answers (2)

Anis R.
Anis R.

Reputation: 6912

You are defining the setter, but not calling it anywhere.

You need to call the setter you defined using groups.userStatus = value;.

And on a side note, I renamed the setter to userStatusAll as I believe it's more specific.

let groups = {
  groupId: 1,
  userRights: {
    users: [{
      name: 'John',
      isActive: true
    },
    {
      name: 'Marry',
      isActive: true
    }
  ]},

  //defining the setter
  set userStatusAll(user) {
    this.userRights.users.forEach(function(user) {
      user.isActive = false;
    });
  },
}

groups.userStatusAll = false; //calling the setter with value of false
console.log(groups.userRights.users);

Upvotes: 1

Nicolae Maties
Nicolae Maties

Reputation: 2675

You need to assign the value to userStatus in order to call the set function. I refactored the function to accept status and user name, to match only a single user and change it's status.

let groups = {
  groupId: 1,
  userRights: {
    users: [{
      name: 'John',
      isActive: true
    },
    {
      name: 'Marry',
      isActive: true
    }
  ]},
  set userStatus({ userName, userStatus }) {
    this.userRights.users.forEach(function(user) {
      if(user.name === userName){
         user.isActive = userStatus;
      }
    });
  },
}

groups.userStatus = { userName: 'John', userStatus: false };
console.log(groups.userRights)

Upvotes: 2

Related Questions