[英]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.