javascript - 搜索二维数组的更有效方法 - 匹配后中断?

标签 javascript arrays loops multidimensional-array break

我有一个学生正在学习的单元的二维数组。对于每个单元,他们正在研究不同数量的功能(也称为目标),并且对于每个功能,他们可以在评估中询问不同数量的提示。我的数据是一个二维数组:

functions = [
  ["Unit 1",
    [ // function 1
      "prompt 1",
      "prompt 2",
      ...,
      "prompt n"],
    [ // function 2
  etc...

我的代码根据已研究的单元创建评估,方法是提取随机提示,然后将它们混入数组 (sm1)。

其中一些提示具有与其关联的图像文件,并且全部具有音频文件。这些媒体文件的文件名取决于它们在我们的 Material 中出现的位置,例如u1f1p1.mp3

所以我的解决方案是通过根据文件在数组中的位置创建文件名来匹配这种规律。这是我执行此操作的代码:

for (var a = 0; a < sm1.length; a++) {// for each of sm1's prompts
    for (var b = 0; b <= functions.length-6; b++) { // limit it to units 1-3 of 8 for this specific assessment
       for(var c = 1; c < functions[b].length; c++) { // for each unit's function but starting at 1 to skip "Unit x" label at this point in the array
           for (var d = 0; d < functions[b][c].length; d++) { // for each prompt for each function for each unit
               if(functions[b][c][d] === sm1[a]) { // see if it matches
                    fileNames.push('u'+(b+1)+'f'+c+'p'+(d+1)); // create file name from index and add to fileNames[]
                }
            }
        }
    }
} 

这段代码工作得很好,而且,因为速度实际上与我们的目的无关,所以我可以说工作完成了。但是,我知道这效率低得令人绝望,因为这不仅是一个很长的循环,而且即使在找到匹配项后它也会继续运行。

那么,有两个问题:

  1. 寻找匹配对象的最有效方法是什么?
  2. 找到 sm1[n] 后如何中断并继续寻找 sm1[n+1]

最佳答案

至于效率,我不确定,但至于打破比赛,它实际上很简单。

一种方法(可能是最好的方法)是将其放入函数中并返回 fileNames当您找到匹配的人时 -

function findFileName(sm1, functions, fileNames) {
  for (var a = 0; a < sm1.length; a++) { // for each of sm1's prompts
    for (var b = 0; b <= functions.length - 6; b++) { // limit it to units 1-3 of 8 for this specific assessment
      for (var c = 1; c < functions[b].length; c++) { // for each unit's function but starting at 1 to skip "Unit x" label at this point in the array
        for (var d = 0; d < functions[b][c].length; d++) { // for each prompt for each function for each unit
          if (functions[b][c][d] === sm1[a]) { // see if it matches
            fileNames.push('u' + (b + 1) + 'f' + c + 'p' + (d + 1)); // create file name from index and add to fileNames[]
            return fileNames;
          }
        }
      }
    }
  }
}

如果使用的函数不适合您,则可以内联完成(后面是黑客代码;您已被警告)。

尽管 for 语句的第二个子句通常依赖于第一个子句 ( a < sm1.length ),但实际上没有什么可以阻止您在其中添加与第一个子句无关的额外约束。因此,您可以在第一个 for 之前添加一个 bool 变量在每次迭代中检查这一点,并在找到匹配项时将其设置为 true -

var matchFound = false;
for (var a = 0; a < sm1.length && !matchFound; a++) { // for each of sm1's prompts
  for (var b = 0; b <= functions.length - 6 && !matchFound; b++) { // limit it to units 1-3 of 8 for this specific assessment
    for (var c = 1; c < functions[b].length && !matchFound; c++) { // for each unit's function but starting at 1 to skip "Unit x" label at this point in the array
      for (var d = 0; d < functions[b][c].length && !matchFound; d++) { // for each prompt for each function for each unit
        if (functions[b][c][d] === sm1[a]) { // see if it matches
          fileNames.push('u' + (b + 1) + 'f' + c + 'p' + (d + 1)); // create file name from index and add to fileNames[]
          matchFound = true;
        }
      }
    }
  }
}

关于javascript - 搜索二维数组的更有效方法 - 匹配后中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44942788/

相关文章:

java - for循环没有完全迭代

具有自己属性的 Javascript 事件监听器循环

javascript - Facebook Messenger 复选框插件未呈现

javascript - 离线 webapp - 存储 JavaScript 对象

javascript - Google Chrome - 使用 iframe 时屏幕捕获失败,相同的脚本在没有 iframe 的情况下工作

javascript - toString() 不工作

javascript - 使用变量导航 JSON

arrays - 我们如何将向量添加到矩阵的单列?

java - 如何做一个随机且唯一的生成器?

javascript - 如何从列表中映射对象属性并将其附加到字符串?