我有两个数组-网格和图案
const G = [ [9,9,9,9,9,9] ] const P = [ [9,9] ]
我想获得G中P的所有出现。因此输出将是这样的:
[ { line: 0, charAtStart: 0, charAtEnd: 2, }, { line: 0, charAtStart: 2, charAtEnd: 4, }, { line: 0, charAtStart: 4, charAtEnd: 6, }, { line: 0, charAtStart: 6, charAtEnd: 8, }, { line: 0, charAtStart: 8, charAtEnd: 10, } ]
到目前为止我所做的:
for(let i = 0, l = G.length; i < l; i++) { if(G[i].toString().includes(P[0].toString())) { console.log(G[i].toString(), '\n', P[0].toString(), '\n', G[i].toString().indexOf(P[0].toString()) ) availableFirstLines.push({ line: i, charAtStringStart: G[i].toString().indexOf(P[0].toString()), charAtStringEnd: (G[i].toString().indexOf(P[0].toString())) + P[0].toString().length - 1 }) } }
所以我循环浏览
G
。首先,我检查P
中是否甚至存在G[0]
。如果是这样,我将其indexOf推到第一个字符和最后一个字符。所以我的输出是
[ { line: 0, charAtStart: 0, charAtEnd: 2, } ]
问题是它确实只检测到第一次出现然后继续前进。我是否应该使用嵌套循环来获取所有出现的信息?
编辑
我不小心提供了错误的输出。我已经更改了。我有两个数组-网格和模式const G = [[9,9,9,9,9,9]] const P = [[9,9]]我想让G中所有P都出现。输出将是这样的:[{... ...>
基本上,您需要三个级别的嵌套循环:
您可以使用const G = [
[9,9,9,9,9,9]
]
const P = [
[9,9]
]
let availableFirstLines = [];
G.forEach((Gv, Gi) => {
const Gs = Gv.toString();
P.forEach(Pv => {
const Ps = Pv.toString();
let i, fi = 0;
while ((i = Gs.indexOf(Ps, fi)) >= 0) {
availableFirstLines.push({
line: Gi,
charAtStringStart: i,
charAtStringEnd: i + Ps.length - 1
});
fi = i + 1;
}
})
});
console.log(availableFirstLines);
递归地执行此操作,并为每个新递归传递一个起始索引。您将需要对图形中的每个“线”进行递归:
您只需要通过G进行1次循环,因为您说过P将是一个单行数组。