2009-05-17 7 views
1

J'ai quelques fonctions qui entourent les cellules environnantes d'une cellule. La grille est contenue dans un tableau.Une façon plus compacte de faire cela?

Dans mon code, j'ai des vérifications pour m'assurer que ce n'est pas l'une des cellules de bord, car la vérification d'une cellule indéfinie provoque une erreur.

En tant que tel, j'ai le code comme ceci:

if(x > 0) { 
    var firstX = x - 1; 
} else { 
    var firstX = x; 
} 
if(x < 199) { 
    var lastX = x + 1; 
} else { 
    var lastX = x; 
} 

if(y > 0) { 
    var firstY = y - 1; 
} else { 
    var firstY = y; 
} 
if(y < 199) { 
    var lastY = y + 1; 
} else { 
    var lastY = y; 
} 

Beaucoup de lignes de code pour faire très peu. Y a-t-il une manière plus élégante de faire ceci?

Répondre

9

Vous pouvez utiliser l'opérateur conditionnel:

var firstX = x > 0 ? x - 1 : x; 
var lastX = x < 199 ? x + 1 : x; 
var firstY = y > 0 ? y - 1 : y; 
var lastY = y < 199 ? y + 1 : y; 

Vous pouvez supprimer la redondance en écrivant une fonction pour calculer « premier » donné une valeur et un similaire pour « dernier » - mais je pense ce serait exagéré dans ce cas.

+0

Merci. Je sais qu'il y avait quelque chose de simple que je négligeais. – Macha

4

Vous pouvez utiliser l'opérateur conditionnel:

var firstX = x - (x > 0 ? 1:0); 
var lastX = x + (x < 199 ? 1:0); 
var firstY = y - (y > 0 ? 1:0); 
var lastY = y + (y < 199 ? 1:0); 

Edit:
offert une autre façon de l'utiliser, comme Jon déjà posté code "mon". ;)

Edit 2:
Comme Rafael a fait remarquer, la condition peut être implicitement converti en un certain nombre, de sorte que l'opérateur conditionnelle n'est pas nécessaire:

var firstX = x - (x > 0); 
var lastX = x + (x < 199); 
var firstY = y - (y > 0); 
var lastY = y + (y < 199); 

Cependant, il est moins évident que ce code fait Est-ce que. De mes tests, il semble que Javascript utilise systématiquement la valeur 1 pour true, mais dans les langages de programmation, la valeur -1 est tout aussi communément utilisée.

+0

l'opérateur ternaire n'est pas nécessaire. Vous pouvez simplement écrire var firstX = x - (x> 0) JS convertira automatiquement la valeur booléenne en Nombre – Rafael

+0

@Rafael: Je dirais que c'est moins lisible que d'utiliser un conditionnel. –

+0

@Jon Skeet: oui, c'est moins lisible, mais c'est plus compact et on utilise des fonctionnalités du langage javascript. Logique vrai est converti en 1 (valeur numérique) et false en 0. – Rafael

10

Ou plus clairement:

var firstX = Math.max(x - 1, 0); 
var lastX = Math.min(x + 1, 199); 
var firstY = Math.max(y - 1, 0); 
var lastY = Math.min(y + 1, 199); 
+0

Cela suppose que x et y sont dans la plage [0, 199]. C'est peut-être le cas, mais c'est une hypothèse. (Considérons x = -10: le code original ferait d'abordX = -9, le tien donnerait 0.) A part ça, je l'aime bien. –

+0

Eh bien, si x ou y < 0 or > 199, quelque chose s'est mal passé ailleurs dans le code, comme dans les circonstances normales, x et y devraient être entre 0 et 199. – Macha

0

Utilisez les variables que vous cocher (x et y) au lieu de premier/LASTx et Première/Lasty

if(x > 0 && x < 199) x-=1; 
else if(x > 0) x+=1; 

if(y > 0 && y < 199) y-=1; 
else if(y > 0) y +=1; 

Il suffit de cocher x et y après. :)

Questions connexes