gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:56:04 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com