1
Roulette.prototype.setColourToNumbers = function() {
  if (this.number == 2 || this.number == 4 || this.number == 6 || this.number == 8 || this.number == 10 || this.number == 11 || this.number == 13 || this.number == 15 || this.number == 17 || this.number == 20 || this.number == 22 || this.number == 24 || this.number == 26 || this.number == 29 || this.number == 28 || this.number == 29 || this.number == 31 || this.number == 33 || this.number == 35)
  { this.colour = 'black' }
 else if (this.number == 1 || this.number == 3 || this.number == 5 || this.number == 7 || this.number == 9 || this.number == 12 || this.number == 14 || this.number == 16 || this.number == 18 || this.number == 19 || this.number == 21 || this.number == 23 || this.number == 25 || this.number == 27 || this.number == 30 || this.number == 32 || this.number == 34 || this.number == 36)
{ this.colour = 'red'}
else
{ this.colour = null}
};

I'm writing a program in Javascript to make a board on Roulette. This code looks very messy to me and I was wondering if there was an cleaner and much shorter way of writing the above? Is there any way I can do it without specifying each number? Like having red numbers in an array? I'm stumped.

Appreciate the help!

fadfad
  • 349
  • 1
  • 5
  • 17

7 Answers7

1

I would suggest keeping a table of what maps where, and looking up values from that as you go. Like so:

var colorValues = {
  "red": [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36],
  "black": [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 25]
};

function getColor(value) {
  for (var f in colorValues) {
    if (colorValues.hasOwnProperty(f) && colorValues[f].indexOf(value) > -1) {
      return f;
    }
  }

  return null;
}

// Check a few
for (var i = 0; i < 40; ++i) {
  $("body").append("<div>" + i + " is " + getColor(i) + "</div>");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

This works by keeping each valid output as a key, with a list of values (I think that's the most obvious structure, given the data). When you receive a value, walk through the keys until you find the one containing that value. If none of them do, return null.

ssube
  • 47,010
  • 7
  • 103
  • 140
1

Check out How do I check if an array includes an object in JavaScript? for some options for Array contains functions.

I'd create an array using shorthand for numbers which resolve to black and a second array for numbers which resolve to red.

Shorthand to create the arrays is var redArray = [1, 3, 5, 7, ...]

Community
  • 1
  • 1
Ryan Nigro
  • 4,389
  • 2
  • 17
  • 23
1

I think you want a switch statement.

switch(this.number) {
  case 1,2,3,4,5,6,7: this.color = 'black'; break;
  case 8,9,10,11,12,13: this.color = 'red'; break;
}

UPDATE

This syntax will only match the last number of the series, so it's no good.

The switch version of this would be

switch(this.number) {
  case 1:
  case 2:
  case 3:
    this.color = red; break;
  case 4:
  case 5:
  case 6:
    this.color = black; break;
}

Which may be a little verbose for your use case.

gdpelican
  • 568
  • 4
  • 12
0

Here you go:

Roulette.prototype.setColourToNumbers = function() {
    this.colour = null;
    var colors = {
        'red' : [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 29, 28, 29, 31, 33, 35],
        'black' : [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36]
    }

    for (var k in colors) {
        if (colors[k].indexOf(this.number) > 0) {
            this.colour = k;
        }
    }
    console.log(this.colour);
};

Beware of indexOf() not working in early IE.

CmajSmith
  • 432
  • 2
  • 8
  • Thank you very much, that worked and passed my tests! I was just wondering, extending on this whether instead of directly setting this.colour, creating 2 methods for setting red and black. I was thinking it may look more readable? – fadfad Nov 04 '14 at 20:20
  • Actually, I've just realised that this code doesn't change this.colour to red or black. It stays null. – fadfad Nov 04 '14 at 20:22
  • Strange as it sets colour in my case. Check [jsFiddle](http://jsfiddle.net/j9xqw8ad/), please. Answering your first question here, it depends on many factors. Personally, I find the function above pretty simple to read and understand. But depending on app's complexity it truly may be simplified by splitting into separate methods. – CmajSmith Nov 04 '14 at 20:51
0

You could also do the inverse of what @ssube suggests, having an array of numbers -> colors. Note the use of comments to track numbers to colors in the source code.

//           0       1      2       3
var wheel= [null, "red", "black", "red", ...];

Then a simple lookup, color = wheel[this.number];

Frankly, I like ssube's idea slightly better, but presenting this as an alternative. YMMV.

user949300
  • 15,364
  • 7
  • 35
  • 66
  • This is probably slightly faster than my solution, but the source is longer. No idea if that's enough to be significant, though. – ssube Nov 04 '14 at 20:49
  • I used this and it worked! Quite a creative solution that fits nicely with roulette numbers. Much appreciated! – fadfad Nov 05 '14 at 11:45
  • Glad to help. Looks like you are new to Stack Overflow, so I'll remind to to vote for any answers you liked, and check/accept one answer as well – user949300 Nov 05 '14 at 18:33
-1

I've noticed that in your first if statment the this.number == 29 boolean clause is incorrectly duplicated.

PS: I am working on my solution now, which will include unit tests.

Bob Gilmore
  • 12,608
  • 13
  • 46
  • 53
JaranF
  • 71
  • 3
-1

Whilst I was writing my answer I saw 'CmajSmith' had put up something pretty similar. The only difference being that I only define the arrays for red vs black lookup once and so I reduce the garbage collection overhead everytime the method runs. Not sure that this is important to you (i.e. performance) but I assumed that your method would be called quite frequently:

Roulette.prototype.setColourToNumbers = function() {
  var colour;
  if (!Roulette.prototype.setColourToNumbers.arrBlackNumbers) {
      Roulette.prototype.setColourToNumbers.arrBlackNumbers = [2, 4, 6, 8, 10, 11, 13, 15, 17, 20, 22, 24, 26, 28, 29, 31, 33, 35];
      Roulette.prototype.setColourToNumbers.arrRedNumbers = [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36];
  }
  colour = Roulette.prototype.setColourToNumbers.arrBlackNumbers.indexOf(this.number) > -1 ? "black" : Roulette.prototype.setColourToNumbers.arrRedNumbers.indexOf(this.number) > -1 ? "red" : null;
  this.colour = colour;
};
// *********************************************************
// U N I T    T E S T E D    M Y    A N S W E R    B E L O W
// *********************************************************
function Roulette(iNum) {
  this.number = iNum;
}
var num, roulette;
//First off unit test the 'black' numbers
num = 2, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 4, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 6, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 8, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 10, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 11, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 13, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 15, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 17, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 20, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 22, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 24, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 26, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 28, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 29, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 31, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num );
num = 33, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 35, roulette = new Roulette(num);
//Now unit test the 'red' numbers
console.assert((roulette.setColourToNumbers(), roulette.colour === 'black'), "Expected \'black\' when number is: " + num);
num = 1, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 3, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 5, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 7, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 9, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 12, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 14, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 16, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 18, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 19, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 21, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 23, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 25, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 27, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 30, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 32, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 34, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);
num = 36, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === 'red'), "Expected \'red\' when number is: " + num);

//Finally unit test other numbers
num = -99, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === null), "Expected null when number is: " + num);
num = Number.POSITIVE_INFINITY, roulette = new Roulette(num);
console.assert((roulette.setColourToNumbers(), roulette.colour === null), "Expected null when number is: " + num);
JaranF
  • 71
  • 3
  • PS the `switch ... case` statement construct does not work. What happened in Chrome when I tried was that it was only the last operand in the comma operator separated list of number operands (i.e. 36 for red etc.) that was tripping the relevant `case` clause. Not really surprising if you understand how comma as an operand works – JaranF Nov 04 '14 at 21:14
  • This is surprisingly over-complicated for the problem at hand. There's no need to lazily initialize the data (in fact, that makes it trivially easy to cheat), you don't need an intermediate variable, and nesting ternaries access prototype members makes for an unreadable line. – ssube Nov 06 '14 at 18:06