2010-11-02 5 views
29

Есть ли способ написать условный оператор switch в javascript?Оператор условного оператора Javascript

Я не догадываясь, так как следующий всегда будет по умолчанию:

var raw_value = 11.0; 
    switch(raw_value) 
    { 
     case (raw_value > 10.0): 
      height = 48; 
      width = 36; 
      break; 
     case (raw_value > 5.0): 
      height = 40; 
      width = 30; 
      break; 
     default: 
      height = 16; 
      width = 12; 
      break; 
    } 

Если нет, то я должен использовать вместо этого - длинный, если/другое заявление?

благодарит :)

+0

Одно хорошее решение было бы массив, и версию JavaScript этого [недавно PHP вопрос] (http://stackoverflow.com/questions/4032753/picking-the-nearest-value-from-an-array-reflecting-ranges) .... но это не будет тривиальным для порта. –

+0

Это не ЭТО длинное выражение if-else (if, else if, else). Довольно стандартный (и меньше отступов). –

+0

Если/else занимает меньше места, легче читать, меньше писать и менее подвержено ошибкам, вызванным самим собой. – BGerrissen

ответ

23

В switch statement, оцениваемое значение выражения switch сравниваются с оцениваемым значением случаев. Таким образом, значение raw_value (число) сравнивается с raw_value > 10.0 (сравнение) и raw_value > 5.0 (сравнение).

Таким образом, если одно из выражений вашего случая не дает числа, равного 11.0, или вы используете выражение switchtrue, вы всегда получите случай по умолчанию.

Просто используйте простой if/else вместо:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
    height = 48; 
    width = 36; 
} else if (raw_value > 5.0) { 
    height = 40; 
    width = 30; 
} else { 
    height = 16; 
    width = 12; 
} 
+1

И без необходимости 'break', это так же чисто, как и оригинал. –

1

Нет, switch утверждение не работа используется как это. Однако это утверждение не всегда проще. Например, версия switch занимает 15 строк:

var raw_value = 11.0; 
switch(raw_value) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
     break; 
} 

и «длинный» if/else версия только 11:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
     height = 48; 
     width = 36; 
} else if (raw_value > 5.0) { 
     height = 40; 
     width = 30; 
} else { 
     height = 16; 
     width = 12; 
} 

Так что в вашем случае, лучше использовать вторую, чем первый ...

+0

Меньше строк кода не объективно «лучше», так как «хороший код» субъективен. Читаемость и простота понимания - два других фактора.Я бы добавил, что этот подход лучше «если цель использует как можно меньше строк кода» – GrayedFox

88

Как это:

var raw_value = 11.0; 
switch(true) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
} 

Выражения в операторах case будут оцениваться до true или false, а если это соответствует состоянию switch ... voilà. default действует как else.

Бонус: вы можете инвертировать всю логику, просто заменив true на false. С операторами if ... else if вам нужно будет редактировать каждое предложение if в отдельности.

+3

Это должен быть правильный ответ, так как он делает то, что задает ОП в стиле. Тем не менее, мне было нелегко в первый раз, когда я увидел оператор switch (true). –

+0

Рад помочь хотя бы одному человеку. :) – DanMan

+1

Вверх проголосовали и должны быть отмечены как ответ. Большинство программистов (или, может быть, только меня) с языком сервера exp. найти реализацию JS неинтуитивной. Это своего рода странное начало оцениваемого выражения и работа в обратном направлении! –

0

Не пытайтесь повторить это дома, или принять его всерьез, это просто для удовольствия ...

function conditionalSwitch(value, cond, callback /* cond, callback, cond, callback, ... */) 
{ 
    for (var i = 1; i < arguments.length; i += 2) { 
    if (arguments[i](value)) { 
     arguments[i+1](value); 
     return; 
    } 
    } 
} 

var width, height; 

conditionalSwitch(5.1, 

    function(val) { return val > 10 }, 
    function() { 
    height = 48; 
    width = 36 
    }, 

    function(val) { return val > 5 }, 
    function() { 
    height = 40; 
    width = 30 
    }, 

    //Default 

    function(val) { return true }, 
    function() { 
    height = 16; 
    width = 12; 
    } 
) 

console.log(width, height); 
+0

С такими вещами речь идет в основном о синтаксическом сахаре .... – Lodewijk

+1

Erm, не должно ли это быть в кодефене или что-то в этом месте? Не вижу смысла в том, чтобы быть здесь ... –

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