Search code examples
javascriptarraysstringify

Find a coordinate in a multidimensional array using string search


Try to give an alternative in this question WITHOUT LOOPING! Just using indexOf and some integer math

Get coordinates of an element in multidimentional array in Javascript

The code below seemed promising but fails.

Anyone with better math skills feel like fixing it?

var letterVariations = [ 
        [' ','0','1','2','3','4','5','6','7','8','9'],
        ['A','a','B','b','C','c','D','d','E','e',';'],
        ['Â','â','F','f','G','g','H','h','Ê','ê',':'],
        ['À','à','I','i','J','j','K','k','È','è','.'],
        ['L','l','Î','î','M','m','N','n','É','é','?'],
        ['O','o','Ï','ï','P','p','Q','q','R','r','!'],
        ['Ô','ô','S','s','T','t','U','u','V','v','“'],
        ['W','w','X','x','Y','y','Ù','ù','Z','z','”'],
        ['@','&','#','[','(','/',')',']','+','=','-'],
    ];

var string = JSON.stringify(letterVariations);
var pos = string.indexOf("u")
console.log(Math.floor((pos/10)%9),pos%10)

// fails, how to fix?
pos = string.indexOf("M")
console.log(Math.floor((pos/10)%9),pos%10)


Solution

  • function findPos(array, symbol) {
      const string = array.toString().replace(/,/g, '');
      const pos = string.indexOf(symbol)
    
      const d = (array[0] || []).length
    
      const x = pos % d;
      const y = Math.floor(pos / d)
    
      return { x, y }
    }
    
    const array = [
      [' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
      ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', ';'],
      ['Â', 'â', 'F', 'f', 'G', 'g', 'H', 'h', 'Ê', 'ê', ':'],
      ['À', 'à', 'I', 'i', 'J', 'j', 'K', 'k', 'È', 'è', '.'],
      ['L', 'l', 'Î', 'î', 'M', 'm', 'N', 'n', 'É', 'é', '?'],
      ['O', 'o', 'Ï', 'ï', 'P', 'p', 'Q', 'q', 'R', 'r', '!'],
      ['Ô', 'ô', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', '“'],
      ['W', 'w', 'X', 'x', 'Y', 'y', 'Ù', 'ù', 'Z', 'z', '”'],
      ['@', '&', '#', '[', '(', '/', ')', ']', '+', '=', '-'],
    ];
    
    
    console.log(findPos(array,' ')) //=> [0, 0]
    console.log(findPos(array,'M')) //=> [4, 4]
    console.log(findPos(array,'u')) //=> [6, 7]
    console.log(findPos(array,'-')) //=> [8, 10]