2015-11-25 3 views
1

Ассоциативный массив:Как проверить, соответствуют ли все значения в ассоциативном массиве? (Javascript)

var signUpStates = { 
    "CNPJ": false, 
    "PASSWORDS": false, 
    "ADDRESS": false, 
    "GENERAL_FIELDS": false, 
    "TERMS": false, 
} 

Моя попытка:

function updateButton() { 
    var tempArray = [] 
    $.each(signUpStates, function(i, val) { 
     tempArray.push(val); 
    }); 
    if(tempArray.every(function(e, i, a) { return e == true; })) { 
     $(".btn-cadastrar-fornecedor").attr('disabled', false); 
    } else { 
     $(".btn-cadastrar-fornecedor").attr('disabled', true); 
    } 
} 

Итерация над ним и проверять по отдельности не работает. Какой лучший подход для проведения такого теста?

+0

должна быть функция '.all()', в зависимости от того, какую библиотеку вы используете – epoch

+0

Я использую JQuery. –

+2

В JavaScript мы просто называем их объектами. –

ответ

2

Наиболее straighforward решение (если вы спрашиваете о логике) будет использовать цикл:

var is = true; 

for (var key in signUpStates) { 
    if (!signUpStates[key]) { 
     is = false; 
     break; 
    } 
} 

Строго говоря, правильный подход будет также проверять только собственные свойства, это важно, если объект вы можете наследовать свойства от других объектов:

var is = true; 

for (var key in signUpStates) { 
    if (signUpStates.hasOwnProperty(key) && !signUpStates[key]) { 
     is = false; 
     break; 
    } 
} 

В простых случаях, подобных вашей, эта дополнительная проверка не требуется.

+0

* Май * стоит упомянуть 'hasOwnProperty'. Не обязательно, учитывая код OP. И +1, иногда старые способы лучше. –

+0

Да, я думал о hasOwnProperty, но в случае OP это не обязательно. Но да, лучше упомянуть. – dfsq

1

Вы можете получить массив имен свойств объекта от Object.keys, а затем использовать Array#every:

if (Object.keys(signUpStates).every(function(name) { return signUpStates[name]; })) { 
    // All are true 
} else { 
    // Not all are true 
} 

С (ака ES6) функций стрелок ES2015, это становится немного короче:

if (Object.keys(signUpStates).every(name => signUpStates[name])) { 
    // All are true 
} else { 
    // Not all are true 
} 

Поддержка ES2015 по-прежнему относительно тонка на земле, особенно если вам приходится обрабатывать браузеры, которые были выпущены до того, как спецификация была завершена, поэтому, если это для общей веб-страницы, вы не будете использовать их или использовать транспилер. Если это, скажем, NodeJS, вы можете использовать их непосредственно в v4 и выше.

+1

, но функции стрелок не поддерживаются в каждом браузере, не так ли. –

+0

@ ZohaibIjaz: Вдали от этого я предполагаю (но, вероятно, не должен), что люди это знают. Я использую транспиляцию. –

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