【问题标题】:Why obj is not iterable为什么 obj 不可迭代
【发布时间】:2019-08-27 15:36:07
【问题描述】:

编译此代码时,我收到一个错误,即 obj 不可迭代。为什么?我必须检查有多少用户在线

let users = {
  Alan: {
    age: 27,
    online: false
  },
  Jeff: {
    age: 32,
    online: true
  },
  Sarah: {
    age: 48,
    online: false
  },
  Ryan: {
    age: 19,
    online: true
  }
};

function countOnline(obj) {
  let num =0;
  for(let user of obj){
    if(user['online']==true){
      num++;
    }
  }
  return num;
}

console.log(countOnline(users));

【问题讨论】:

    标签: javascript object for-loop


    【解决方案1】:

    因为您使用的是for...of 而不是for...in

    for...of 用于循环 iterable objectsfor...in 迭代对象的可枚举属性。要使for...of 工作,对象必须实现@@iterator 方法(数组、字符串、Set 等)

    let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      }
    };
    
    function countOnline(obj) {
      let num = 0;
      for (let user in obj) {
        if (obj[user]['online'] == true) {
          num++;
        }
      }
      return num;
    }
    
    console.log(countOnline(users));

    for...in 中,user 变量将表示对象的键,如Alan。因此,要获取属性的值,您需要使用obj[user](例如:obj["Alan"])。因此,条件将更改为:

    if (obj[user]['online'] == true)
    

    【讨论】:

    • 但即使在使用 in 而不是 on num 之后返回为 0。
    • @AdityaLamba 您还需要将条件更改为obj[user]['online']
    • @AdityaLamba 我已经添加了 belwo sn-p 的解释。 user 将是键名,例如 "Alan""Jeff"。字符串中没有 online 属性。 obj[user] 将获得 "Alan" 键的值
    【解决方案2】:

    默认情况下,对象没有@@iterator 符号,要使用for..of,您需要将其添加到对象中:

    let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      }
    };
    
    users[Symbol.iterator] = function*() {
      for (value of Object.values(this)) {
        yield value;
      }
    };
    
    for (let user of users) {
      console.log(user)
    }

    或将for..ofObject.entries 一起使用(或Object.values

    let users = {
      Alan: {
        age: 27,
        online: false
      },
      Jeff: {
        age: 32,
        online: true
      },
      Sarah: {
        age: 48,
        online: false
      },
      Ryan: {
        age: 19,
        online: true
      }
    };
    
    for (let [key, value] of Object.entries(users)) {
      console.log('key :', key, 'value : ', value)
    }
    
    console.log('***********');
    
    for (let user of Object.values(users)) {
      console.log({user})
    }

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2017-02-09
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多