簡體   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