2016-11-01 5 views
3

этот код ниже работает хорошо, но плагин ESLint показать предупреждение: «Использование„ForinStatement“не допускается», поэтому я хочу, чтобы изменить его на другие способы, чтобы предотвратить предупреждение:Другие способы прокрутки объекта JavaScript?

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; 
     } 
     } 
    } 
+1

Почему 'Const key'? Почему бы не 'let' или' var'. Также '{} .hasOwnProperty.call (groups [key], 'users')' может быть 'groups [key] .hasOwnProperty ('users')' – Rajesh

+2

@Rajesh Поскольку 'key' не изменяется внутри тела цикла. Это рекомендуемая практика. –

+0

@ MadaraUchiha Я этого не знал. Но будет ли вторая итерация не пытаться переопределить ее, так как будет создан «const key»? – Rajesh

ответ

11

Если ваша цель состоит в том, чтобы избежать ошибок в 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; 
     } 
    } 
}); 
+2

спасибо, он отлично работает. Однако для предотвращения ESLint вам следует изменить «Object.keys (groups) .forEach (key => {" to "Object.keys (groups) .forEach ((key) => {" – methis

+0

Параметры области со стрелкой не требуют скобок, когда single: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions Неповторимо сделать это своим путем, хотя, ++! – Roberrrt

0

Вы используете один строка для проверки и подсчета.

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

, ваше решение получило неправильный результат. – methis

+0

Что не так в вашем тесте? –

+0

Btw, лучше использовать '' пользователей 'в группах [key] '(вместо' groups [key] .hasOwnProperty (' users ') '), так как в противном случае семантика кода отличается. – zerkms

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. Тогда вам больше не нужно использовать его.

Смежные вопросы