循环JavaScript对象的其他方法?

问题描述 投票:5回答:4

下面的代码运行良好,但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;
        }
      }
    }
javascript ecmascript-6
4个回答
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
投票

以下是三种可能的解决方法,具体取决于您需要的地图部分,键,值或键/值对。

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

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

如果您只需要钥匙:

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

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

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

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文件中为它做一个例外。然后你不需要再次使用它。


0
投票

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

let count = Object.keys(groups).reduce((r, key) =>
    r + (('users' in groups[key]) && groups[key].users.length || 0), 0);
© www.soinside.com 2019 - 2024. All rights reserved.