Кто-нибудь может объяснить, почему при записи в консоль переменной countOnlineUsers она не хранит счет в памяти? - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь выполнить итерацию по двумерному объекту, чтобы подсчитать, сколько пользователей имеют свои онлайн-свойства, установленные в онлайн, однако, когда я пытаюсь использовать console.log () переменную countOnlineUsers, она не содержит счетчик иКажется, он сбрасывается каждый раз, когда цикл попадает в «новое» онлайн-свойство «нового» пользователя.

    let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      },
      George: {
        age: 32,
        online: true
      }
    };
    
    function countOnline(obj) {
    
      for(let user in users) {

    if (!users.hasOwnProperty(user)) continue; //Makes first check

      let obj = users[user];     
      for(let prop in obj) {
        if (!obj.hasOwnProperty(prop)) continue; //Makes second check

          let countOnlineUsers = 0;
          if(obj[prop] === true) {            
            countOnlineUsers++;
          }
          console.log(prop + " = " + obj[prop]);
          console.log(countOnlineUsers);        
      }        
  

    }

    }
    
    console.log(countOnline(users));

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Это потому, что countOnhlineUsers находится внутри loop.Вы должны объявить это вне этого.И изменить его внутри

let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      },
      George: {
        age: 32,
        online: true
      }
    };
    
    function countOnline(obj) {
      let countOnlineUsers = 0;
      for(let user in users) {

    if (!users.hasOwnProperty(user)) continue; //Makes first check

      let obj = users[user];     
      
      for(let prop in obj) {
        if (!obj.hasOwnProperty(prop)) continue; //Makes second check

          
          if(obj[prop] === true) {            
            countOnlineUsers++;
          }
          console.log(prop + " = " + obj[prop]);
          console.log(countOnlineUsers);        
      }        
  

    }

    }
    
    console.log(countOnline(users));
0 голосов
/ 10 февраля 2019

Вы устанавливаете значение на 0 на каждой итерации цикла:

for(let user in users) {
    //...
    let countOnlineUsers = 0;
    //...
}

Поскольку вы изменяете значение только один раз в этой итерации, оно может быть только 0 или 1.Вместо этого установите значение перед в цикле:

let countOnlineUsers = 0;
for(let user in users) {
    //...
}

Тогда каждая итерация цикла будет изменять одно и то же значение (если выполняется его условие) вместо того, чтобы всегда создавать новое значение.

(Обратите внимание, что у вас есть вложенные циклы, мне в основном приходилось угадывать, для какого из них вы хотите увеличить значение.)

Ваш оригинальный код с этой модификацией:

let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      },
      George: {
        age: 32,
        online: true
      }
    };
    
    function countOnline(obj) {
    
      let countOnlineUsers = 0;
      for(let user in users) {

    if (!users.hasOwnProperty(user)) continue; //Makes first check

      let obj = users[user];     
      for(let prop in obj) {
        if (!obj.hasOwnProperty(prop)) continue; //Makes second check

          if(obj[prop] === true) {            
            countOnlineUsers++;
          }
          console.log(prop + " = " + obj[prop]);
          console.log(countOnlineUsers);        
      }        
  

    }

    }
    
    console.log(countOnline(users));
...