2010-09-27 4 views

Respuesta

24

Probar:

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

Se llama una expresión ternaria.

+0

Exactamente lo que estaba buscando - gracias! – Bojangles

+5

Pero esto establecerá 'string1' aunque el valor sea' string3', no solo para 'string2' –

+0

@ dev-null-dweller esto no es un problema - Alternaré el texto en un botón entre 'Responder' y 'Cancelar' :) – Bojangles

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

o aclaraciones

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

Te refieres a utilizar el operador ternario:

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

¿por qué vuelves a agarrar el objeto jquery? – jcolebrand

7

Mire mA, ningún operador ternario!

Lo siguiente funciona porque Javascript cortocircuita las expresiones booleanas.

Si something == string1 luego evaluar string2 - desde string2 es un valor Truthy y la siguiente expresión implica la operación OR no hay necesidad de continuar. Detener y devolver string2.

Si something !== string1 omite el siguiente operando porque si es falso, no tiene sentido evaluar el siguiente operando (con Y). "Saltará" a la operación OR y devolverá string1.

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

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

Si desea que la asignación de hecho:

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

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

En el final, sin embargo, iba a terminar con el operador ternario porque esta solución podría ser poco claro para otros programadores. Si proviene de Java u otros idiomas, puede esperar que la función devuelva un valor booleano debido a todos los operadores booleanos.

+0

Ok, entonces todavía tiene que asignar 'something' allí en alguna parte. No asignaste, solo comparaste. – jcolebrand

+0

@Daniel ... sí, lo sé. Mi punto era más como el ternario lee más rápido que eso, y todavía tiene que mostrar la tarea en su publicación inteligente;) – jcolebrand

+0

+1 solución inteligente, aunque debe explicar * por qué * esto funciona. –

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

Cómo sobre el uso @ código de Daniel junto con una función de jQuery:

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

Realmente no hay beneficio para usar mi solución sobre un operador ternario, simplemente pensé que sería bueno ofrecer una versión alternativa :). ¡Bien! ¿este 'ya' no es un objeto jQuery? Entonces no hay necesidad de envolverlo con la función '$'. Además, jQuery probablemente devuelve 'this' cuando se llama a' val' como un setter, por lo que podría fusionar esas dos líneas en una única declaración de retorno de una línea. –

+0

De hecho, estás en lo cierto. Gracias por el consejo :) Actualizaré el código. Y me gusta el tuyo sobre el operador ternario porque las preguntas me asustan: P – fehays

1

A partir de jQuery 1.4, usted puede hacer esto:

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

Un poco complejo, pero gracias :-) – Bojangles

2

Otra manera de hacerlo a través del objeto Propiedades:

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

Como en el qu estion:

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

Esto es una pregunta extrema, pero si vas a contestar tal vez podrías agregar un ejemplo de implementación, lo harás fíjate que la mayoría de las respuestas subevaladas lo hacen. Saludos – webLacky3rdClass

+0

¡Muy inteligente! Estaría tentado de usarlo, pero por dos razones; 1, no está claro de inmediato qué hace este código y 2, hoy en día usaría desestructuración de ES6 como '[string2, string1] = [string1, string2]' – Bojangles

+0

@Bojangles dos conmuta dos cadenas, sí, pero ¿cómo usaría ES6? características para su pregunta original? – kolossal7

Cuestiones relacionadas