function Board(board) {

  this.currentArray = board;
	
	this.cell = function(row, column) {
		return board[row].charAt(column);
	};
	
	this.setCell = function(row, column, char) {
		var str = board[row];
		board[row] = str.substr(0, column) + char + str.substr(column+char.length);
	};

	this.next = function() {
		var newBoard = _.map(_.range(board.length), function(row) {
			var rowStr = "";
			_.each(_.range(board[row].length), function(column) {
				count = Board.countLiveNeighbours(board, row, column);
				char = board[row].charAt(column);
				rowStr += Board.newChar(char,count);
			});
			return rowStr;
		});
		return new Board(newBoard);
	};

}

Board.countLiveNeighbours = function(board, row, column) {
	var count = 0;
	var maxRow = board.length;
	var maxCol = board[0].length;
	var allowedRow = _.intersection([ row - 1, row, row + 1 ], _.range(maxRow));
	var allowedCol = _.intersection([ column - 1, column, column + 1 ], _.range(maxCol));
	var temp = _.map(allowedRow, function(r) {
		_.map(allowedCol, function(c) {
			if (!(r == row && c == column)) {
				cell = board[r].charAt(c);
				if (cell == "*") {
					count = count + 1;
				}
				return cell;
			}
			return "-";
		});
	});
	return count;
};

Board.newChar = function(char, count){
	newchar = "";
	if (char == "*") {
		if (count < 2) {
			return ".";
		}
		if (count > 3) {
			return ".";
		}
		return "*";
	} 
	if (count == 3) {
		return "*";
	} 
	return ".";
};
<!DOCTYPE html>
<html>
<head>
    <script src="http://d3js.org/d3.v3.min.js"></script>
    <script src="http://underscorejs.org/underscore-min.js"></script>
    <script src="game-of-life.js"></script>
</head>
<body>
    <div id="viz"></div>
    <script type="text/javascript">
    
  var arr = ["........................",
               "..***...................",
               "..***...................",
               "..***.....*.*...........",
               ".........*..*...........",
               ".......***..............",
               "........*...............",
               ".......*................",
               "........*...............",
               ".......*................",
               "......*.................",
               "......*.................",
               "........................",
               "........................",
               "........................"];
	
	var currentBoard = new Board(arr);
	var currentArray = currentBoard.currentArray;

    var sampleSVG = d3.select("#viz")
	    .append("svg")
	    .attr("width", 500)
	    .attr("height", 400);  
   
    var cellArray = new Array;
    
    _.each(_.range(currentArray.length), function(row) {
    	cellArray[row] = new Array;
    	_.each(_.range(currentArray[row].length), function(column) {
    		var currentCell = sampleSVG.append("circle")
	    	    .style("stroke", "gray")
	    	    .style("fill","aliceblue")
	    	    .attr("r", 10)
	    	    .attr("cx", 20*(column+1))
	    	    .attr("cy", 20*(row+1));
    		
    		currentCell.on("mouseover", function(){
    			currentBoard.setCell(row,column,"*");
    			currentCell.style("fill","green");
    		});
    		
    		cellArray[row][column] = currentCell;
    	});
    });
    
	function next(){
        _.each(_.range(currentArray.length), function(row) {
        	_.each(_.range(currentArray[row].length), function(column) {
        		currentChar = currentArray[row].charAt(column);
        		cellArray[row][column].style("fill", (currentChar == "*")?"gray":"aliceblue");
        	});
        });
        
        currentBoard = currentBoard.next();
    	currentArray = currentBoard.currentArray;
	}
	
	setInterval(function(){next()},100);

    </script>
</body>
</html>