二维数组中的每个数组出现次数>>

问题描述 投票:1回答:3

我有两个数组-网格和图案

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都出现。输出将是这样的:[{... ...>

javascript arrays
3个回答
1
投票

基本上,您需要三个级别的嵌套循环:

  1. 环绕G中的值

1
投票

您可以使用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);递归地执行此操作,并为每个新递归传递一个起始索引。您将需要对图形中的每个“线”进行递归:


0
投票

您只需要通过G进行1次循环,因为您说过P将是一个单行数组。

© www.soinside.com 2019 - 2024. All rights reserved.