使用字符串搜索在多维数组中查找坐标

问题描述 投票:2回答:5

尝试在没有循环的情况下给出这个问题的替代方案!只需使用indexOf和一些整数数学

Get coordinates of an element in multidimentional array in Javascript

下面的代码似乎很有希望,但失败了

任何具有更好数学技能的人都喜欢修理它吗?

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)%8),pos%10)

// fails, how to fix?
pos = string.indexOf("M")
console.log(Math.floor((pos/10)%8),pos%10)
javascript arrays stringify
5个回答
2
投票

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]

2
投票

您可以连接字符串并使用内部数组的长度作为divisioin或余数运算符的值。这仅适用于具有单个字符的字符串。

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', '”'],
        ['@', '&', '#', '[', '(', '/', ')', ']', '+', '=', '-']
    ],
    string = letterVariations.map(a => a.join('')).join(''),
    pos = string.indexOf("u");

console.log(Math.floor(pos / 11), pos % 11);

pos = string.indexOf("M")
console.log(Math.floor(pos / 11), pos % 11);

1
投票

这是一个版本:

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','”'],
  ['@','&','#','[','(','/',')',']','+','=','-'],
];

const findLetterIn = letterVariations => {
  const width = letterVariations[0].length * 4 + 2;
  const alpha = JSON.stringify(letterVariations)

  return (char, pos = alpha.indexOf(char)) => pos > -1 
    ? [Math.floor((pos - 1) / width), (((pos - 1) % width) - 2)/4]
    : [-1, -1]
}

const findLetter = findLetterIn (letterVariations)

console.log(findLetter(' ')) //=> [0, 0]
console.log(findLetter('M')) //=> [4, 4]
console.log(findLetter('u')) //=> [6, 7]
console.log(findLetter('-')) //=> [8, 10]

这里width与行宽有关。

4s与u ~> "u",有关+ 2[]添加到开头和结尾(以及,之后的额外],但在它之前删除一个。)- 1与忽略最初的[有关和- 2有关去除领先的,",或者,对于第一个,领先的["

您可以通过向返回数组的两个元素添加1来切换到基于1的索引。


1
投票

这会产生正确的结果。没有必要进行字符串化,你可以展平数组并使用indexOf来获得位置:

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 flattened = letterVariations.flat()

var findLetter = function(letter) {
  var pos = flattened.indexOf(letter),
    x = Math.floor((pos / 10) % 8),
    y = (pos - (pos % 11)) / 11;
  return {
    letter: letter,
    x: x,
    y: y
  }
}
console.log(findLetter(' ')) //=> [0, 0]
console.log(findLetter('M')) //=> [4, 4]
console.log(findLetter('u')) //=> [6, 7]
console.log(findLetter('-')) //=> [8, 10]

0
投票

基于@GluePear的答案

您甚至可以在此解决方案中使用多个字符

function findPos(array, symbol) {
  const string = array.flat();
  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, '-'))
© www.soinside.com 2019 - 2024. All rights reserved.