Любой способ переключаться между двумя строками, используя один кусок JavaScript? - PullRequest
13 голосов
/ 28 сентября 2010

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

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

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

Ответы [ 9 ]

29 голосов
/ 28 сентября 2010

Попробуйте:

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

Это называется троичным выражением.

7 голосов
/ 28 сентября 2010

Смотри, ма, без троичного оператора!

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

Если something == string1, то оценить string2 - поскольку string2 является истинным значением, а следующее выражение включает операцию ИЛИ, продолжать не нужно Остановись и вернись 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 или других языков, вы можете ожидать, что функция вернет логическое значение из-за всех логических операторов.

2 голосов
/ 02 февраля 2017

Другой способ сделать это, используя свойства объекта:

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

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

something.val(
  { 'string1': 'string2', 'string2': 'string1' }[something.val()]
)
2 голосов
/ 28 сентября 2010

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

$.fn.toggleVal = function (str1, str2) {
     return this.val(this.val() == str1 && str2 || str1);
};
$("input").toggleVal('string 1', 'string 2');
1 голос
/ 07 декабря 2010

Начиная с jQuery 1.4, вы можете сделать это:

something.val(function(index, val) {
    return val == 'string1' ? 'string2' : 'string1';
});
1 голос
/ 28 сентября 2010

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

something.val((something.val() == 'string1') ? 'string2' : 'string1');
0 голосов
/ 22 июля 2018

Хотя решения с троичным оператором являются наиболее читабельными, вы также можете использовать xor из Lodash:

x = _.xor([a, b], [x])[0]

Для вашего конкретного случая:

something.val(_.xor(['s1', 's2'], [something.val()])[0]);

Ссылка: https://lodash.com/docs/4.17.10#xor

0 голосов
/ 28 сентября 2010
something.val(something.val() == 'string1' ? 'string2' : 'string1');
0 голосов
/ 28 сентября 2010
 something.val( something.val() == 'string1'? 'string2' : 'string1' );

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

val astring = something.val() == 'string1'? 'string2' : 'string1';
something.val( astring );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...