1var sudokuBoard = [
 2  [[5], [3], [], [], [7], [], [], [], []],
 3  [[6], [], [], [1], [9], [5], [], [], []],
 4  [[], [9], [8], [], [], [], [], [6], []],
 5  [[8], [], [], [], [6], [], [], [], [3]],
 6  [[4], [], [], [8], [], [3], [], [], [1]],
 7  [[7], [], [], [], [2], [], [], [], [6]],
 8  [[], [6], [], [], [], [], [2], [8], []],
 9  [[], [], [], [4], [1], [9], [], [], [5]],
10  [[], [], [], [], [8], [], [], [7], [9]],
11];
12
13function getCoordsOfBoxesInSameSubBox(x, y) {
14  let subBoxX = Math.floor(x / 3);
15  let subBoxY = Math.floor(y / 3);
16  let coords = [];
17  for (let subBoxBoxX = 0; subBoxBoxX < 3; subBoxBoxX++) {
18    for (let subBoxBoxY = 0; subBoxBoxY < 3; subBoxBoxY++) {
19      let globalX = subBoxBoxX + subBoxX * 3;
20      let globalY = subBoxBoxY + subBoxY * 3;
21      if (!(globalX === x && globalY === y)) {
22        coords.push({ x: globalX, y: globalY });
23      }
24    }
25  }
26  return coords;
27}
28
29function getCoordsOfBoxesInSameXandY(x, y) {
30  let coords = [];
31  for (let boxX = 0; boxX < 9; boxX++) {
32    if (!(boxX === x)) {
33      coords.push({ x: boxX, y: y });
34    }
35  }
36  for (let boxY = 0; boxY < 9; boxY++) {
37    if (!(boxY === y)) {
38      coords.push({ x: x, y: boxY });
39    }
40  }
41  return coords;
42}
43
44function getPossibleNumbers(x, y, sudokuBoard) {
45  let possibleNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
46  let coordsToCheck = getCoordsOfBoxesInSameSubBox(x, y).concat(
47    getCoordsOfBoxesInSameXandY(x, y)
48  );
49  for (let coordIndex in coordsToCheck) {
50    let coord = coordsToCheck[coordIndex];
51    let boxData = sudokuBoard[coord.x][coord.y];
52    if (boxData.length === 1) {
53      var index = possibleNumbers.indexOf(boxData[0]);
54      if (index !== -1) {
55        possibleNumbers.splice(index, 1);
56      }
57    }
58  }
59  return possibleNumbers;
60}
61
62function iterativelySolveSudokuBoard(sudokuBoard) {
63  let newSudokuBoard = sudokuBoard;
64  for (let x in sudokuBoard) {
65    let sudokuBoardRow = sudokuBoard[x];
66    for (let y in sudokuBoard) {
67      let sudokuBox = sudokuBoardRow[y];
68      if (!(sudokuBox.length === 1)) {
69        newSudokuBoard[x][y] = getPossibleNumbers(x, y, sudokuBoard);
70      }
71    }
72  }
73  return newSudokuBoard;
74}
75
76let solved = false;
77while (!solved) {
78  sudokuBoard = iterativelySolveSudokuBoard(sudokuBoard);
79  solved = true;
80  for (let x in sudokuBoard) {
81    let sudokuBoardRow = sudokuBoard[x];
82    for (let y in sudokuBoard) {
83      let sudokuBox = sudokuBoardRow[y];
84      if (!(sudokuBox.length === 1)) {
85        solved = false;
86      }
87    }
88  }
89}
90console.log(sudokuBoard);