2009-05-17 17 views
1

Ich habe ein paar Funktionen, die die umgebenden Zellen einer Zelle umkreisen. Das Gitter ist in einem Array enthalten.Kompakterer Weg, dies zu tun?

In meinem Code habe ich Prüfungen, um sicherzustellen, dass es sich nicht um eine der Randzellen handelt, da das Überprüfen einer undefinierten Zelle einen Fehler verursacht.

Als solche habe ich Code wie folgt:

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; 
} 

Viele Zeilen Code sehr wenig zu tun. Gibt es einen eleganteren Weg, dies zu tun?

Antwort

9

Sie können den bedingten Operator verwenden:

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; 

Sie die Redundanz durch das Schreiben eine Funktion entfernen konnten „ersten“ Wert gegeben zu berechnen, und ein ähnliches für „letzten“ - aber ich denke, das wäre in diesem Fall übertrieben.

+0

Danke. Ich weiß, dass es etwas Einfaches gab, das ich übersah. – Macha

4

können Sie den bedingten Operator verwenden:

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:
eine alternative Art und Weise, es zu benutzen Angeboten, wie Jon bereits gebucht "meinen" Code. ;)

Edit 2:
Als Rafael wies darauf hin, kann die Bedingung implizit in eine Zahl umgewandelt werden, so wird der Bedingungsoperator nicht benötigt:

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

Allerdings ist es weniger offensichtlich, was dieser Code tatsächlich tut. Aus meinen Tests geht hervor, dass Javascript den Wert 1 konsistent für "True" verwendet, aber in allen Programmiersprachen wird der Wert -1 genauso häufig verwendet.

+0

wird der ternäre Operator nicht benötigt. Sie können einfach schreiben var firstX = x - (x> 0) JS wird automatisch den booleschen Wert in Nummer – Rafael

+0

@Rafael: Ich würde sagen, das ist weniger lesbar als mit einer bedingten obwohl. –

+0

@ Jon Skeet: Ja, es ist weniger lesbar, aber es ist kompakter und wir verwenden Funktionen der Javascript-Sprache. Logisch Wahr wird in 1 (Zahlenwert) und Falsch in 0 umgewandelt. – Rafael

10

Oder deutlicher:

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

Das geht davon aus, dass x und y im Bereich [0, 199] liegen. Das mag gut sein, aber es ist eine Annahme. (Betrachte x = -10: der ursprüngliche Code würde firstX = -9 ergeben, deins würde 0 ergeben.) Ansonsten mag ich es aber. –

+0

Nun, wenn x oder y < 0 or > 199, ist irgendwo anders im Code etwas schiefgelaufen, da unter normalen Umständen x und y zwischen 0 und 199 liegen sollten. – Macha

0

Verwenden Sie die Variablen, die Sie überprüfen (x und y) statt Erste/lastx und Erste/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; 

Gerade x und y überprüfen danach. :)

Verwandte Themen