2010-05-28 4 views
8

Existe-t-il un meilleur moyen d'écrire le conditionnel suivant en javascript?main courte pour enchaîner les opérateurs logiques en javascript?

if (value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something') { 
    // blah blah blah 
} 

Je déteste avoir tous ces OU logiques reliés ensemble. Je me demande s'il y a une sorte de sténographie.

Merci!

Répondre

5
var a = [1, 16, -500, 42.42, 'something']; 
var value = 42; 
if (a.indexOf(value) > -1){ 
// blah blah blah 
} 

Mise à jour: Exemple de fonction utile proposée dans les commentaires:

Object.prototype.in = function(){ 
    for(var i = 0; i < arguments.length; i++){ 
    if (this == arguments[i]) return true; 
    } 
    return false; 
} 

Vous pouvez écrire:

if (value.in(1, 16, -500, 42.42, 'something')){ 
// blah blah blah 
} 
+8

Soyez juste conscient que le 'Array.prototype.La méthode indexOf' n'est pas disponible sur IE. – CMS

+1

@CMS Merci pour un avis précieux. Bien, peut être réparé à la fois. http://stackoverflow.com/questions/1744310/how-to-fix-array-indexof-in-javascript-for-ie-browsers – Li0liQ

+0

Cela pourrait faire une bonne fonction utilitaire pour éviter de rendre l'instruction if encore plus complexe que la original. Juste passer dans un tableau de valeurs et voila vous avez une syntaxe abrégée. – JohnFx

2

non, c'est la sténographie.

comme alternative, vous pouvez faire un switch

switch (value) { 
case 1 : 
case 16 : 
case -500 : 
    .... 
} 

qui est plus facile à gérer si vous avez besoin de beaucoup de valeurs possibles, mais en réalité votre version est plus courte de toute façon :)

+0

S'il est mélangé, vous pouvez convertir une valeur en chaîne et comparer les chaînes. Plus lent mais possible. Je pense aussi que cette option est plus lisible que l'option 'indexOf' présentée. –

+0

oh vous avez raison, je pensais que c'était java pas javascript :) – oedo

4

Vous pouvez étendre l'objet de tableau:

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i] == obj) { 
     return true; 
    } 
    } 
    return false; 
} 

Ensuite, si vous stockez toutes ces valeurs dans un tableau que vous pourriez faire quelque chose comme MyValues.contains (valeur)

+0

Si la contrainte de type n'est pas attendue, je recommanderais d'utiliser '===' au lieu de '==', mais avec IMO, avec cette approche, la meilleure chose est d'utiliser la norme [ 'Array.prototype.indexOf'] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf) méthode, comme [@ Li0liQ] (http://stackoverflow.com/questions/2932131/short-hand-for-chaining-logique-opérateurs-en-javascript/2932166 # 2932166) mentionne, est disponible * nativement * sur tous les navigateurs sauf IE. – CMS

+0

Je ne suis pas un pro javascript - bon à savoir. Merci – Prescott

0

Le commutateur est un choix acceptable. Vous pouvez également utiliser une carte, en fonction de la complexité du problème (en supposant que vous en ayez plus que dans votre exemple).

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true }; 
if (accept[value]) { 
    // blah blah blah 
} 

accepter pourrait être généré de façon progamatique à partir d'un tableau bien sûr. Cela dépend vraiment de combien vous prévoyez d'utiliser ce modèle. :/

0

Eh bien, vous pouvez utiliser une instruction switch ...

switch (value) { 
    case 1 : // blah 
       break; 
    case 16 : // blah 
       break; 
    case -500 : // blah 
       break; 
    case 42.42: // blah 
       break; 
    case "something" : // blah 
        break; 
} 

Si vous utilisez JavaScript 1.6 ou plus, vous pouvez utiliser la notation indexOf sur un tableau:

if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) { 
    // blah 
} 

Et pour le nec plus ultra en hackiness, vous pouvez forcer les valeurs à cordes (cela fonctionne pour tous les navigateurs):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) { 
    // blah 
} 
1
var value= -55; 
switch(value){ 
    case 1: case 16: case -55: case 42.5: case 'something': 
     alert(value); break;   

} 
0

Dans un effort pour faire encore une autre façon de le faire ...

if (/^(1|16|-500|42.42|something)$/.test(value)) { 
    // blah blah blah 
} 

Pas besoin d'étendre les prototypes de tableau ou quoi que ce soit, il suffit d'utiliser un regexp rapide pour tester la valeur!

Questions connexes