Le code doit être lisible, donc être succinct ne doit pas signifier être laconique quel qu'en soit le prix - pour cela, vous devez renvoyer à https://codegolf.stackexchange.com/ - donc à la place je recommanderais d'utiliser une seconde variable locale nommée index
pour maximiser l'intelligibilité de la lecture (avec un coût d'exécution minimal aussi, je note) :
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
Mais si vous voulez vraiment réduire cette expression, parce que vous êtes un sadique cruel envers vos collègues ou collaborateurs de projet, alors voici 4 approches que vous pourriez utiliser :
1 : Variable temporaire dans un var
déclaration
Vous pouvez utiliser le var
la possibilité pour l'instruction de définir (et d'affecter) une deuxième variable temporaire index
lorsqu'ils sont séparés par des virgules :
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
2 : Fonction anonyme auto-exécutoire
Une autre option est une fonction anonyme auto-exécutoire :
// 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) );
3 : Opérateur de virgule
Il y a aussi le tristement célèbre "opérateur virgule" que JavaScript prend en charge et qui est également présent en C et C++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
Vous pouvez utiliser l'opérateur virgule lorsque vous souhaitez inclure plusieurs expressions dans un emplacement qui requiert une seule expression.
Vous pouvez l'utiliser pour introduire des effets de bord, dans ce cas en réassignant à value
:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
Cela fonctionne parce que var value
est interprété en premier (car il s'agit d'une déclaration), et puis le plus à gauche, le plus à l'intérieur value
puis la droite de l'opérateur virgule, et enfin l'opérateur ternaire - tout cela est du JavaScript légal.
4 : Réaffectation dans une sous-expression
Le commentateur @IllusiveBrian a fait remarquer que l'utilisation de l'opérateur virgule (dans l'exemple précédent) est inutile si l'affectation à value
est utilisé comme une sous-expression entre parenthèses :
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
Notez que l'utilisation de la négation dans les expressions logiques peut être plus difficile à suivre pour les humains - ainsi tous les exemples ci-dessus peuvent être simplifiés pour la lecture en changeant idx !== -1 ? x : y
à idx == -1 ? y : x
:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );
0 votes
Quel type d'intervalle recherchez-vous ? de 1 à ? ou des nombres pairs ou des nombres impairs ou ?
0 votes
Cela ne dépendrait-il pas du fait que la condition ait deux issues différentes, dont aucune n'est identique à la condition elle-même ?
0 votes
C'est juste un exemple. Si une valeur est trouvée, alors donnez la valeur, sinon donnez un 0.
2 votes
Donc un
if
et non unif/else
0 votes
Si vous vérifiez contre null au lieu de -1, cela pourrait être raccourci
53 votes
just an example of when you might have repeated things in the ternary
ne répétez pas les expressions calculées. C'est à cela que servent les variables.4 votes
Comment pouvons-nous déterminer que
3
n'est pas à l'index0
desomeArray
?3 votes
Quel est votre objectif ici ? Essayez-vous de réduire la longueur de la ligne, ou spécifiquement d'éviter la répétition d'une variable dans un ternaire ? Le premier objectif est possible, le second ne l'est pas (du moins, pas en utilisant des ternaires).
0 votes
Comme l'a dit @vol7ron, évitez de répéter les calculs. Sinon, je pense que c'est assez lisible comme "si l'indice existe, utiliser l'indice, sinon zéro" - la répétition est bien pour la lisibilité.
0 votes
Juste pour éviter le
!
,var value = someArray.indexOf(3) === -1 ? 0: someArray.indexOf(3)
semble mieux. Mais JS n'est pas mon fort.0 votes
Dans le LSM, il y a une fonction intégrée pour cela.
$v1
pour la valeur de l'opérande de gauche et$v2
pour la droite. fr.wikichip.org/wiki/mirc/identifiants/$v15 votes
Pourquoi ne pas utiliser
Math.max(someArray.indexOf(3), 0)
à la place ?0 votes
J'espère pour vous
someArray
ne sera pas vide.