2017-03-14 3 views
0

Dites que j'ai une fonction qui doit vérifier une correspondance avec l'une des deux valeurs différentes. Cependant, l'entrée est très compliquée:Javascript: syntaxe de raccourci pour le contrôle conditionnel?

function checker(id, value){ 
    if (this.state.users[id].items[value].name === 'onething ' || 
    this.state.users[id].items[value].name === 'theotherthing '){ 
    // my action 
    } 
} 

Ce que je finis par faire est la suivante:

function checker(id, value){ 
    var name = this.state.users[id].items[value].name 
    if (name === 'onething ' || name === 'theotherthing '){ 
    // my action 
    } 
} 

Est-il possible de faire quelque chose comme ceci:

function checker(id, value){ 
    if (this.state.users[id].items[value].name === 'onething ' || 'theotherthing '){ 
    // my action 
    } 
} 

Il est évident que la deuxième méthode prend moins de frappe et est plus facile à refactoriser que le premier. Comment peuvent-ils comparer la mémoire et la vitesse?

+0

troisième ide comme moi, mais pas pour javascipt –

Répondre

2

En ECMAScript 2016, vous pouvez faire quelque chose comme:

if (['onething ','theotherthing'].includes(this.state.users[id].items[value].name)) { 
    //do stuff 
} 

La déclaration se compose des éléments suivants:

  1. l'instruction if (évidemment)

  2. une définition de tableau : ['onething ','theotherthing']

  3. c alling la méthode includes() sur le tableau précédemment défini.

En javascript, un tableau est un objet qui possède des méthodes comme n'importe quel autre objet. L'une de ces méthodes est includes() qui vérifie que l'argument est contenu dans le tableau. Le type de retour de cette méthode est booléen donc par l'instruction if il est évalué directement, sans aucun casting

En savoir plus sur includes() méthode here

+0

J'aime cette réponse le meilleur, bien qu'il fait essentiellement la même chose que la réponse de @ nina, juste avec la nouvelle ES6 '.includes'. Pourriez-vous éditer ceci pour expliquer aux débutants ce que cela fait et comment cela fonctionne? – Life4ants

+0

je vais essayer –

3

Vous pouvez utiliser Array#indexOf et un test contre -1

if (['onething ', 'theotherthing '].indexOf(this.state.users[id].items[value].name) !== -1){ 
+0

ou une simple regex, mais je crois qu'il ne veut pas –

+0

Est-ce que cela fonctionne uniquement avec les tableaux? Il semble que votre réponse manque la partie '.name'. (Je viens de faire l'exemple pour cette question, je cherche quelque chose qui s'appliquera généralement) – Life4ants

+0

@ Life4ants, à droite, la partie manquait, mais vous avez l'idée du motif. vous pouvez mettre toute la chaîne dans le tableau et vérifier avec indexOf. –

0

Vous pouvez utiliser notation objet:

if (this.state.users[id].items in {"onething ":1, "theotherthing ":1}){ 

Ou, une expression rationnelle ld fonctionne aussi - plus courte, mais moins efficace:

if (/onething |theotherthing /.test(this.state.users[id].items)){