【问题标题】:Find a coordinate in a multidimensional array using string search使用字符串搜索在多维数组中查找坐标
【发布时间】:2019-08-04 08:51:01
【问题描述】:

尝试在这个问题中给出一个替代方案,不要循环!只需使用 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)

【问题讨论】:

  • 你想用“% 8”做什么?
  • JSON.strinigfy 给你[[" ","0","1","2","3","4","5","6","7","8","9"],["A","a","B","b","C","c","D","d","E","e",";"]...这样的字符串,你不能在这里搜索,最好使用letterVariations.toString()
  • 嗯,这是一个 11 x 9 的网格,而不是 10 x 8。
  • 对于x的位置,我想你可以尝试将值与字符串的长度成比例。示例:u 的索引为 307,使用:Math.floor((pos*11)/string.length) 您可以获得x 位置,在这种情况下为 8。它是 11,因为它是 11x9 网格。不过,我不确定如何获得 Y 值。
  • @AlexOwl 介意解释为什么? JSON.stringify 不会随意添加内容,并且由于数组中每个项目的长度始终相同,因此您应该能够取回信息。此外,我认为最初的问题是通过保持当前编写的逻辑来修复他提供的代码。

标签: javascript arrays stringify


【解决方案1】:

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]

【讨论】:

  • 如果其中一个条目超过一个字符会怎样?
  • @MarkMeyer 它坏了)你需要使用像上面这样的普通解决方案来处理这种情况
  • 哦,好吧,这很有趣。介意解释如何计算 X 和 Y 吗?无论如何,这回答了这个问题。当然,具有多个字符的元素会破坏算法,但我认为这仍然回答了问题。
【解决方案2】:

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

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);

【讨论】:

  • 你的地图不是stringify的变种吗?
  • 为什么比地图有开销?
  • 字符串化的版本有引号、逗号和括号,这会产生用于获取位置和计算索引的字符开销。
  • 还有一些(可能不重要但确实存在的)性能优势:measurethat.net/Benchmarks/Show/4740
【解决方案3】:

这是其中的一个版本:

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", 有关, 但删除它之前的一个。)- 1 与忽略初始 [ 有关,- 2 与删除前导 ," 或第一个前导 [" 有关。

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

【讨论】:

    【解决方案4】:

    这会产生正确的结果。无需字符串化,可以将数组展平,使用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]

    【讨论】:

    • 最后一个字符失败
    【解决方案5】:

    基于@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, '-'))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2014-01-08
      相关资源
      最近更新 更多