下面的代码运行良好,但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;
}
}
}
答案 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文件中为它创建一个例外。那你就不需要再次使用它了。