Любой способ переключиться между двумя строками, используя один кусок JavaScript?

Я хочу сделать что-то вроде

if(something.val() == 'string1')
{
     something.val('string2');
}
else if(something.val() == 'string2')
{
    something.val('string1')
}

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

Ответ 1

Try:

something.val(something.val() == 'string1' ? 'string2' : 'string1');

Он называется тернарным выражением.

Ответ 2

Посмотрите ma, нет тройного оператора!

Следующее работает, поскольку логические выражения Javascript коротких замыканий.

Если something == string1, тогда оцените string2 - поскольку string2 является истинным значением, а следующее выражение включает операцию OR, нет необходимости продолжать. Остановить и вернуть string2.

Если something !== string1, то он пропустит следующий операнд, потому что, если он является ложным, нет смысла оценивать следующий операнд (с AND). Он "прыгнет" в операцию ИЛИ и вернет string1.

function toggleString(something, string1, string2) {
   return something == string1 && string2 || string1;
}

something.val(toggleString(something.val(), "string1", "string2"));

Если вы хотите выполнить задание:

function toggleValue(something, string1, string2) {
   something.val(something.val() == string1 && string2 || string1);
}

toggleValue(something, "string1", "string2"); // something is a jQuery collection

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

Ответ 3

Как насчет использования кода @Daniel вместе с функцией jquery:

$.fn.toggleVal = function (str1, str2) {
     return this.val(this.val() == str1 && str2 || str1);
};
$("input").toggleVal('string 1', 'string 2');

Ответ 4

Другой способ сделать это с помощью свойств объекта:

{ 'string1': 'string2', 'string2': 'string1' }[value]

Как и в вопросе:

something.val(
  { 'string1': 'string2', 'string2': 'string1' }[something.val()]
)

Ответ 5

Вы хотите использовать тернарный оператор:

something.val((something.val() == 'string1') ? 'string2' : 'string1');

Ответ 6

Как и в jQuery 1.4, вы можете сделать это:

something.val(function(index, val) {
    return val == 'string1' ? 'string2' : 'string1';
});

Ответ 7

 something.val( something.val() == 'string1'? 'string2' : 'string1' );

или для уточнения

val astring = something.val() == 'string1'? 'string2' : 'string1';
something.val( astring );

Ответ 8

something.val(something.val() == 'string1' ? 'string2' : 'string1');