下面的代码运行良好,但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;
}
}
}
如果你的目标只是为了避免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;
}
}
});
以下是三种可能的解决方法,具体取决于您需要的地图部分,键,值或键/值对。
如果您不仅需要键,而且还需要地图中的值,您可以选择:
for (const [key, value] of Object.entries(object)) {
// ...
}
如果您只需要钥匙:
for (const key of Object.keys(object)) {
// ...
}
最后,如果您只需要值,而不是您可以使用的键:
for (const value of Object.values(object)) {
// ...
}
我想实现一个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文件中为它做一个例外。然后你不需要再次使用它。
您使用一行进行检查和计数。
let count = Object.keys(groups).reduce((r, key) =>
r + (('users' in groups[key]) && groups[key].users.length || 0), 0);