0

我正在编写一个函数,它将给定的单词作为参数,并根据这个二维数组返回其字符的位置:

let keyboard = [
  ["a", "b", "c", "d", "e", "1", "2", "3"],
  ["f", "g", "h", "i", "j", "4", "5", "6"],
  ["k", "l", "m", "n", "o", "7", "8", "9"],
  ["p", "q", "r", "s", "t", ".", "@", "0"],
  ["u", "v", "w", "x", "y", "z", "_", "/"],
];

function tvRemote(word) {
  let arr = [...word];
  let position = [];
  for (let rows = 0; rows < keyboard.length; rows++) {
    for (let cols = 0; cols < keyboard[rows].length; cols++) {
      for (i of arr) {
        keyboard[rows][cols] === i ? position.push([i, rows, cols]) : null;
      }
    }
  }
  return position;
}
console.log( tvRemote("your") );

我想获取位置以执行一些计算,但是当将行和列推送到位置数组时,返回似乎得到了排序。

预期输出:

[ [ 'y', 4, 4 ], [ 'o', 2, 4 ], [ 'u', 4, 0 ], [ 'r', 3, 2 ] ]

我得到了什么:

[ [ 'o', 2, 4 ], [ 'r', 3, 2 ], [ 'u', 4, 0 ], [ 'y', 4, 4 ] ]

有谁知道发生了什么?如果是这样,我该如何防止自动排序?

4

3 回答 3

2

问题是您按行和列的顺序进行迭代,而不是按字母的顺序。

仔细阅读你的代码;首先你设置rows = 0,然后cols = 0,然后你迭代arr。对于第一种情况,您将查看keyboard[0][0]并检查它是否与 中的任何字母匹配,如果匹配arr,则将其推送到position。如果没有匹配项,您将移至下一列,然后最终移至下一行。

相反,您需要按照 in 中的字母顺序进行迭代arr,如下所示:

function tvRemote(word) {
  let arr = [...word];
  let position = [];
  for (i of arr) {
    for (let rows = 0; rows < keyboard.length; rows++) {
      for (let cols = 0; cols < keyboard[rows].length; cols++) {
        keyboard[rows][cols] === i ? position.push([i, rows, cols]) : null;
      }
    }
  }
  return position;

tvRemote("your");
于 2021-07-02T17:58:05.890 回答
1

您可以将单词迭代移到顶部以获得所需的顺序。

更好的方法是在查找时继续外循环。

function tvRemote(word) {
  let arr = [...word];
  let position = [];
  outer: for (i of arr) {
    for (let rows = 0; rows < keyboard.length; rows++) {
      for (let cols = 0; cols < keyboard[rows].length; cols++) {
        if (keyboard[rows][cols] === i) {
          position.push([i, rows, cols]);
          continue outer;
        }
      }
    }
  }
  return position;
}

let keyboard = [["a", "b", "c", "d", "e", "1", "2", "3"], ["f", "g", "h", "i", "j", "4", "5", "6"], ["k", "l", "m", "n", "o", "7", "8", "9"], ["p", "q", "r", "s", "t", ".", "@", "0"], ["u", "v", "w", "x", "y", "z", "_", "/"]];

console.log(tvRemote("your"));

通过收集对象中的所有索引并仅映射所需单词的快速方法。

function tvRemote(word) {
    return Array.from(
        word,
        l => positions[l]
    );
}

let keyboard = [["a", "b", "c", "d", "e", "1", "2", "3"], ["f", "g", "h", "i", "j", "4", "5", "6"], ["k", "l", "m", "n", "o", "7", "8", "9"], ["p", "q", "r", "s", "t", ".", "@", "0"], ["u", "v", "w", "x", "y", "z", "_", "/"]],
    positions = keyboard.reduce((r, a, i) => {
        a.forEach((l, j) => r[l] = [l, i, j]);
        return r;
    }, {})

console.log(tvRemote("your"));

于 2021-07-02T17:57:25.680 回答
0

您的循环首先在矩阵上工作,然后在您的单词中搜索。由于您的矩阵按字母顺序排列,这就是您面对这个问题的原因。

除了您需要在顶层移动单词循环之外,您也不需要使用spread运算符。for of可以迭代字符串。

function tvRemote(word) {
  let position = [];
     for (let i of word) {
  for (let rows = 0; rows < keyboard.length; rows++) {
    for (let cols = 0; cols < keyboard[rows].length; cols++) {
 
        keyboard[rows][cols] === i ? position.push([i, rows, cols]) : null;
      }
    }
  }

  return position;
}
于 2021-07-02T18:05:16.647 回答