首页 > 解决方案 > 二维数组中的每个数组出现

问题描述

我有两个数组 - 网格和模式

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,
    }
]

问题是它确实只检测到第一次出现然后继续。我应该有嵌套循环来获取每一次出现吗?

编辑 我不小心提供了错误的输出。我已经改变了它。

标签: javascriptarrays

解决方案


基本上你需要三层嵌套循环:

  1. 循环 G 中的值
  2. 为 G 中的每个值循环 P 中的值
  3. 循环遍历 G 值以查找所有出现的 P 值

第三部分可以通过while循环完成indexOf,将fromIndex值设置为刚刚超过上一场比赛的开始:

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);


推荐阅读