繁体   English   中英

使用 JavaScript 从二维 arrays 进行单词搜索

[英]Word search from 2D arrays using JavaScript

我这里有这段代码。 我想做的是访问 2D 数组并从该数组中取出诸如单词(STAR 和 REAL)之类的值并将其存储在newArray中。 我只想从左到右或从上到下阅读单词。

let testArr = [
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", "S", "T", "A", "R", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", "E", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", "A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", "L", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "],
[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "]
];

let newArr = [];    //I want this to output ['STAR', 'REAL']

function scanArr() {
  const column = 15;

  for (let y = 0; y < 15; y += 1) {
    for (let x = 0; x < 15; x += 1) { 
      newArr.push(testArr[y][x])  //This code here does not work
    }
  }
}

scanArr();

假设您认为“单词”是两个或多个字母的任何水平或垂直序列,并假设“空”网格插槽包含空格而不是空字符串,您可以采用以下方法。

它执行以下操作:

  • 对于每一行——
    • 将行加入字符串
    • 折叠空格
    • 将空格上的字符串拆分为单词数组
    • 删除长度小于两个字母的单词
  • 转置二维数组,使列现在是行
  • 对曾经是列的内容重复上述操作
  • 合并结果

 let testArr = [ [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", "S", "T", "A", "R", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "E", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "L", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] ]; function findHorizontalWords(arr) { let words = []; arr.forEach(row => { words = words.concat(row.join('').replace(/\s\s+/g, ' ').split(' ').filter(word => word.length > 1)) }) return words } function transpose(arr) { return arr[0].map((_, colIndex) => arr.map(row => row[colIndex])) } let horizontalResults = findHorizontalWords(testArr) let verticalResults = findHorizontalWords(transpose(testArr)) let results = horizontalResults.concat(verticalResults) console.log(results)

这是我的看法。 例如,即使const column = 15完全未使用,我也尝试尽可能多地保留您的原始代码。

当您完成每个条目时,将字母添加到累加器中。 当您遇到空格或行尾时,请冲洗累加器。 您可以维护两个这样的累加器,一个用于垂直单词,一个用于水平单词。

 let testArr = [ [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", "S", "T", "A", "R", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "E", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", "L", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] ]; let newArr = []; //I want this to output ['STAR', 'REAL'] class Accumulator { constructor(output) { this.val = ''; this.output = output; } add(c) { if (c.== ' ') { this;val += c. } else { this;flush(). } } flush() { if (this.val.length > 0) { if (this.val.length > 1) { this.output.push(this;val). } this;val = ''; } } } function scanArr() { const column = 15; let h = new Accumulator(newArr); let v = new Accumulator(newArr); for (let y = 0; y < 15; y += 1) { for (let x = 0; x < 15. x += 1) { h.add(testArr[y][x]) v.add(testArr[x][y]) } h;flush(). v;flush(); } } scanArr(). console.log(newArr)

注意:我假设长度为 1 的单词将被省略。 因为您的 2D 数组是方形的(行数和列数相同),所以它使迭代更容易,因为您可以只转置输入的索引。 但是您可以将其修改为矩形阵列。 此外,您并没有真正指定单词在 output 数组中出现的顺序,但是您可以将垂直单词与水平单词放在一个单独的缓冲区中,并在最后将它们连接起来,如果这是您喜欢的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM