Arun J
Arun J

Reputation: 131

Finding row and column of a multidimensional array in javascript

I defined an array in javascript like this:

var chessboard = []; 
chessboard.push(["a1", "b1", "c1","d1","e1","f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);

What I'm struggling to find out is how to find the index if the element is passed.

Example: If I pass "a5" the programme should be able to tell me (row,column) as (4,0)

**CODE:**
<!DOCTYPE html>
<html>
<head>
<title>Javascript Matrix</title>
</head>
<body>
<script>
var chessboard = [];
chessboard.push(["a1", "b1", "c1","d1","e1", "f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);
alert(chessboard[0][1]); // b1
alert(chessboard[1][0]); // a2
alert(chessboard[3][3]); // d4
alert(chessboard[7][7]); // h8
</script>
</body>
</html>

This is where I am right now.

EDIT2:

Thank you so much everyone :) I feel very happy.

It seems there are multiple ways to it! What I'm trying to do is this >> Find out the (row,column) of two squares. Example: Square 1: a4
Square 2: c7

||x,y|| = row1-row2, column1-column2

Now find out (x,y) from another 8x8 matrix/array. And display data from matrix(x,y).

Upvotes: 3

Views: 3367

Answers (5)

Nina Scholz
Nina Scholz

Reputation: 386654

For frequent use, I suggest to take an object with the positions and return just an array with the coordinates of the wanted field.

var chessboard = [["a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"], ["a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2"], ["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"], ["a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4"], ["a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5"], ["a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6"], ["a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7"], ["a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"]],
    positions = Object.create(null); // empty object without prototypes

chessboard.forEach(function (a, i) {
    a.forEach(function (b, j) {
        positions[b] = [i, j];
    });
});

console.log(positions['a5']); // [4, 0]
console.log(positions);
.as-console-wrapper { max-height: 100% !important; top: 0; }

For getting a field name, you could use Number#toString, with a radix of 36 for letters.

function getField(i, j) {
    return (j + 10).toString(36) + (i + 1).toString(10);
}

console.log(getField(4, 0)); // 'a5'
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 3

Ori Drori
Ori Drori

Reputation: 191986

Since it's a chessboard you can get the info from the element itself, without iterating the board:

function findCoo(el) {
  return [
    el[1] - 1, // the row value - 1
    el[0].codePointAt() - 'a'.codePointAt() // the column ascii value - ascii value of a
  ];
}

console.log("a5", findCoo("a5"));
console.log("d6", findCoo("d6"));
alert("a5" + ' ' + findCoo("a5"));

Upvotes: 3

kevguy
kevguy

Reputation: 4438

Since what you're storing is a chessboard, so instead of traversing all the elements inside the array and do searching, you can add a method to chessboard and return the [row,column] by some simple calculation:

let chessboard = [["a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"], ["a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2"], ["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"], ["a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4"], ["a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5"], ["a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6"], ["a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7"], ["a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"]]

chessboard.findEl = (input) => ([input[1]-1 ,input[0].charCodeAt(0)-97])

console.log(chessboard.findEl("a5"))
console.log(chessboard.findEl("b4"))

Upvotes: 1

Suvethan Nantha
Suvethan Nantha

Reputation: 2464

Try this

function getElement(val){
var result;
  for(var i=0;i<chessboard.length;i++){
         result=chessboard[i].indexOf(val);
     if(result!=-1){
        result='[' + i+',' + result + ']';
        break;
     }
  }
  return result;
}

console.log(getElement("a5"));

Upvotes: 0

Rajesh
Rajesh

Reputation: 24925

You can try something like this:

Logic:

  • Loop over all array chessBoard and iterate over every row.
  • Check if the value exists in the row.
    • If yes, return row as iterator and column as index

var chessboard = []; 
chessboard.push(["a1", "b1", "c1","d1","e1","f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);

function findPosition(str){
  for(var i = 0; i< chessboard.length; i++) {
    var index = chessboard[i].indexOf(str);
    if(index>=0) {
      return "row: " + i + ", col: " + index;
    }
  }
}

console.log(findPosition('a5'));
console.log(findPosition('d5'));

Upvotes: 1

Related Questions