2014-09-17 3 views
0

Я работаю над куском javascript, который устанавливает значение цвета, основанное на статусе healthcheck. Значения цвета строки привязываются к CSS, с которыми я работаю, а статусы строк привязываются к проверкам работоспособности, указанным в этом скрипте.Получить самый высокий статус из списка

Эта функция предназначена для установки значения цвета для каждой проверки состояния здоровья и возврата общего состояния системы. Общий статус должен соответствовать худшему состоянию проверки работоспособности (например, если большинство из них «нормально», а одно - «смертельно», то в целом должно быть «опасно»).

Текущий код работает, чтобы установить индивидуальные значения цвета, но не в целом. Есть ли «элегантный» способ установить общий, не используя много вложенных операторов if?

function getStatus(checks) { 
    var overall = ''; 
    for (j in checks) { 
    checks[j]['color'] = ''; 
     switch (checks[j].status) { 
      case 'OK': 
       checks[j]['color'] = 'success'; 
       break; 
      case 'INFO': 
       checks[j]['color'] = 'info'; 
       break; 
      case 'WARN': 
       checks[j]['color'] = 'warning'; 
       break; 
      case 'ERROR': 
       checks[j]['color'] = 'danger'; 
       break; 
      case 'FATAL': 
       checks[j]['color'] = 'danger'; 
       break; 
     } 
    } 
    return overall; 
} 

я мог бы сделать что-то вроде этого:

case 'WARN': 
    if (overall === "OK" || overall === "INFO") { 
     overall = 'warning'; 
    } 

... но это становится грязным, особенно при проверке «ERROR», которая должна быть больше, чем 3 значения, но меньше, чем один. Есть ли более эффективный способ?

+0

просто выполните 'var fatal = false;' и в вашем фатальном случае установите fatal в true. Тогда ваше возвращение является «возвратом фатальным» и основано на том, что оно является истинным или ложным, отображая все, что вам нравится. edit: я вижу, что вам это нужно для предупреждения, ошибки и смертельного исхода? Это точно? – Ronnie

+0

Как это связано с angularJS? Это чистый javascript. –

+0

@CyrilDD вы правы. Часть, которую я здесь включил, - это чистый javascript - угловатость не имеет отношения к моему вопросу. Соответственно обновлено. – vastlysuperiorman

ответ

1

Ну там нет другой выбор? Но возможны некоторые улучшения. Добавить еще один для цикла + переключатель. Если есть ошибка где-то, что вам не нужно, чтобы продолжить цикл, и вы можете вернуть «опасность»

overall = 'success' 

for (j in checks) { 
    switch (checks[j].status) { 

     case 'OK': 
      break; 
     case 'INFO': 
      if (overall === 'success') 
       overall = 'info' 
      break; 
     case 'WARN': 
      if (overall === 'success' || overall === 'warning') 
       overall = 'warning' 
      break; 
     case 'ERROR': 
     case 'FATAL': 
      return 'danger' 
    } 
} 
+0

Хм, извините, я могу смутить: каковы возможные значения для «общего»? Просто «хорошо», «предупреждение» и «опасность»? Или 'OK', 'INFO', 'WARN', 'DANGER' и 'FATAL'? –

+0

Значения «OK», «INFO», «WARN», «DANGER» и «FATAL» должны быть переведены на «успех», «информация», «предупреждение» или «опасность». Функция получает проверки var, содержащие несколько значений в первом списке. В целом возвращается, содержащий один из второго списка. Редактирование моего ответа для уточнения. – vastlysuperiorman

+0

Я обновил свой ответ, считая, что OK

1

Используйте числа вместо строк, а затем (если я понял, что вы пытаетесь сделать) это просто случай возврата самого высокого статуса, который вы получаете. Вы можете использовать ассоциативный массив для хранения строки представления, кода ошибки и цвета для каждого состояния в отдельных объектах и ​​переместить окружающую (с тем преимуществом, что вы можете бен от этого переключателя заявления):

var statuses = { 
    ok:  { code: 1, status: 'OK', color: 'success'}, 
    info: { code: 2, status: 'INFO', color: 'info'}, 
    warn: { code: 3, status: 'WARN', color: 'warning'}, 
    error: { code: 4, status: 'ERROR', color: 'danger'}, 
    fatal: { code: 5, status: 'FATAL', color: 'danger'}, 
} 

// example checks 
var checks = [statuses['ok'], statuses['warn'], statuses['fatal']]; 

function getStatus(checks) { 

    var overall = statuses['ok']; 

    for (check in checks) { 
    if (check.code > overall.code) { 
     overall = check; 
    } 
    } 
    return overall; 
} 
+0

Откат предыдущей редакции, которую я не считаю приемлемой, поскольку она принципиально изменила ответ. @editor - я думаю, что в этом случае вы должны были разместить свой собственный ответ, а не редактировать мой. –

0

После ответа net.uk.sweet, вы можете определить enum для хранения значений статуса

medical.status = { 
    INFO : 0, 
    OK : 1, 
    WARNING : 2, 
    DANGER : 3, 
    FATAL : 4 
} 

А в остальной части кода, вместо того, чтобы давать строковые значения checks[j], вы должны назначить одну из этих констант:

checks[j].status = medical.status.DANGER 

в n вы можете использовать оператор < так же, как в ответе net.uk.sweet

+0

Я редактирую уже существующий код - вход всегда будет одним из INFO, OK, WARNING, ERROR, FATAL и вывода всегда должен быть один из успехов, информация, предупреждение, опасность. Я думаю, что enum - хорошая идея. – vastlysuperiorman

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