Por ejemplo, algo como esto:
var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0¿Hay una mejor manera de escribir eso? Nuevamente, no estoy buscando una respuesta a la pregunta anterior exacta, solo un ejemplo de cuándo podría tener operandos repetidos en expresiones de operadores ternarios ...
Personalmente, creo que la mejor manera de hacer esto sigue siendo la buena declaración if :
var value = someArray.indexOf(3); if (value === -1) { value = 0; }El código debe ser legible, por lo que ser breve no debe significar ser conciso sin importar el costo, para eso debe volver a publicar en https://codegolf.stackexchange.com/ , por lo que recomendaría usar una segunda variable local llamada index para maximizar la comprensión de lectura (con un costo mínimo de tiempo de ejecución también, observo):
var index = someArray.indexOf( 3 ); var value = index == -1 ? 0 : index;Pero si realmente quieres reducir esta expresión, porque eres un sádico cruel con tus compañeros de trabajo o colaboradores del proyecto, aquí hay 4 enfoques que podrías usar:
var Puede usar la capacidad de la instrucción var para definir (y asignar) un segundo index variable temporal cuando se separa con comas:
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;Otra opción es una función anónima autoejecutable:
// Traditional syntax: var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) ); // ES6 syntax: var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );También existe el infame "operador de coma" compatible con JavaScript, que también está presente en C y C++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
Puede usar el operador de coma cuando desee incluir varias expresiones en una ubicación que requiera una sola expresión.
Puede usarlo para introducir efectos secundarios, en este caso reasignándolo a value :
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 ); Esto funciona porque el var value se interpreta primero (ya que es una declaración), y luego la asignación de value más a la izquierda, más interna, y luego la mano derecha del operador de coma, y luego el operador ternario - todo JavaScript legal.
El comentarista @IllusiveBrian señaló que el uso del operador coma (en el ejemplo anterior) no es necesario si la asignación al value se usa como una subexpresión entre paréntesis:
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 ); Tenga en cuenta que el uso de negativos en expresiones lógicas puede ser más difícil de seguir para los humanos, por lo que todos los ejemplos anteriores se pueden simplificar para leer cambiando idx !== -1 ? x : y a idx == -1 ? y : x :
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );para numeros
Puede usar la función Math.max() .
var value = Math.max( someArray.indexOf('y'), 0 ); Mantendrá los límites del resultado desde 0 hasta el primer resultado mayor que 0 si ese es el caso. Y si el resultado de indexOf es -1 , devolverá 0 si es mayor que -1 .
Para valores booleanos y booleanos-y
Para JS no existe una regla general AFAIK, especialmente porque se evalúan los valores falsos.
Pero si algo te puede ayudar la mayoría de las veces es el operador or ( || ):
// Instead of var variable = this_one === true ? this_one : or_this_one; // you can use var variable = this_one || or_this_one; Tienes que tener mucho cuidado con esto, porque en tu primer ejemplo, indexOf puede devolver 0 y si evalúas 0 || -1 devolverá -1 porque 0 es un valor falso .