循环JavaScript对象的其他方法?

时间:2016-11-01 09:24:52

标签: javascript ecmascript-6

下面的代码运行良好,但ESLint插件显示警告:“不允许使用'ForinStatement'”所以我想将其更改为其他方法来阻止警告消息:

    let count = 0;
    for (const key in groups) {
      if (Object.prototype.toString.call(groups[key]) === '[object Object]') {
        if ({}.hasOwnProperty.call(groups[key], 'users')) {
          count += groups[key].users.length;
        }
      }
    }

4 个答案:

答案 0 :(得分:12)

如果你的目标只是为了避免ESLint中的错误,我建议使用Object.keys(obj).forEach()我通常会在自己的项目中采用这种方法。

伪示例:

Object.keys(groups).forEach(key => {
    if (Object.prototype.toString.call(groups[key]) === '[object Object]') {
        if ({}.hasOwnProperty.call(groups[key], 'users')) {
            count += groups[key].users.length;
        }
    }
});

答案 1 :(得分:1)

根据所需的映射部分,键,值或键/值对,有以下三种解决方法。

如果不仅需要键,还需要地图中的值,则可以选择:

for (const [key, value] of Object.entries(object)) {
  // ...
}

如果您只需要按键:

for (const key of Object.keys(object)) {
  // ...
}

最后,如果只需要值而不是键,则可以使用:

for (const value of Object.values(object)) {
  // ...
}

答案 2 :(得分:0)

您使用一行进行检查和计数。

let count = Object.keys(groups).reduce((r, key) =>
    r + (('users' in groups[key]) && groups[key].users.length || 0), 0);

答案 3 :(得分:0)

我喜欢实现一个it辅助函数来迭代对象:

function* it(obj) {
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      yield [key, obj[key]];
    }
  }
}

然后你可以像这样迭代:

for (const [key, value] of it(obj)) {
  if ({}.toString.call(value) === '[object Object]' &&
      value.hasOwnProperty('users')) {
      count += connections[key].users.length;
    }
}

虽然此方法仍然使用for..in,但它现在包含在一个函数中,您可以在ESLint文件中为它创建一个例外。那你就不需要再次使用它了。