为什么在 javascript 循环中嵌套的 foreach 不起作用?
why nested foreach within javascript loop not working?
我正在尝试检查用户的回答是否正确。用户的答案存储在变量“stad”中。正确的选项存储在变量“collectie”中。但是,这个变量是一个带有嵌套数组的数组。所以我首先循环遍历“collectie”,检查 collectie 元素是否不是数组,如果不是,检查提交的值是否在这个 collectie 元素内。
如果 collectie 元素是一个数组,我必须稍微改变函数以便变量检查答案是否在嵌套数组中。
我有以下内容:
function nakijken() {
var collectie = ["parijs", "8", "ijsselmeer", ["Volkswagen", "Audi", "Opel", "Porsche", "BMW", "Mercedes", "Mercedes-Benz"],
["Texel", "Vlieland", "Terschelling", "Ameland", "Schiermonnikoog"]];
var stad = [];
var a = 0;
stad.push(document.getElementsByTagName("input"));
collectie.forEach(uitpakken);
function uitpakken(antwoord) {
if (!Array.isArray(antwoord)) {
stad.forEach(myfunction);
function myfunction(item) {
if (antwoord.includes(item.value.toLowerCase())) {
item.style.background = "green";
a++;
} else {
antwoord.style.background = "red";
}
}
}
else{
antwoord.Foreach(uitpakken);
function uitpakken(antwoord) {
stad.forEach(mysecondfunction);
function mysecondfunction(item) {
if (antwoord.includes(item.value.toLowerCase())) {
item.style.background = "green";
a++;
} else {
antwoord.style.background = "red";
}
}
}
}
}
但是,我收到错误消息:item.value 未定义。
在控制台中,我看到该项目是输入的集合,而不是单个输入。
为什么这不起作用?
主要问题似乎在
stad.push(document.getElementsByTagName("input"));
因为这会将返回的元素集合作为单个引用推送到 stad
中(而且 HTML 集合不是真正的数组)。相反,您可以使用
stad = Array.from(document.getElementsByTagName("input"));
其次,在 if
语句的第一个分支中, antwoord
不是数组, if (antwoord.includes(item.value.toLowerCase()))
是什么意思?您可能想使用简单的比较,例如 if (antwoord === item.value.toLowerCase())
.
第三,有一处错字是Foreach
而不是forEach
。
第四,您确定要循环遍历主正确答案数组中每个条目的所有输入框吗?每个输入框不都对应一个特定的问题,有特定的正确答案或一组正确答案吗?
document.getElementsByTagName
不是 return 一个数组,它 return 是一个活动的 HTML 集合,不能迭代使用 forEach,尽管您可以通过索引号 (https://developer.mozilla.org/en-US/docs/Web/API/document/getElementsByTagName).
引用其元素
此外,您然后将整个集合作为一个项目推送到 stad
数组,这就是为什么您看到 item
是输入的集合——该集合(实时 HTML 元素) 是 stad
数组中的 只有 项。
正如另一个答案所建议的,不是使用 stad.push
,而是通过从集合中创建一个数组来简单地将一个真正的数组分配给 stad
:
stad = Array.from(document.getElementsByTagName("input"));
我正在尝试检查用户的回答是否正确。用户的答案存储在变量“stad”中。正确的选项存储在变量“collectie”中。但是,这个变量是一个带有嵌套数组的数组。所以我首先循环遍历“collectie”,检查 collectie 元素是否不是数组,如果不是,检查提交的值是否在这个 collectie 元素内。
如果 collectie 元素是一个数组,我必须稍微改变函数以便变量检查答案是否在嵌套数组中。
我有以下内容:
function nakijken() {
var collectie = ["parijs", "8", "ijsselmeer", ["Volkswagen", "Audi", "Opel", "Porsche", "BMW", "Mercedes", "Mercedes-Benz"],
["Texel", "Vlieland", "Terschelling", "Ameland", "Schiermonnikoog"]];
var stad = [];
var a = 0;
stad.push(document.getElementsByTagName("input"));
collectie.forEach(uitpakken);
function uitpakken(antwoord) {
if (!Array.isArray(antwoord)) {
stad.forEach(myfunction);
function myfunction(item) {
if (antwoord.includes(item.value.toLowerCase())) {
item.style.background = "green";
a++;
} else {
antwoord.style.background = "red";
}
}
}
else{
antwoord.Foreach(uitpakken);
function uitpakken(antwoord) {
stad.forEach(mysecondfunction);
function mysecondfunction(item) {
if (antwoord.includes(item.value.toLowerCase())) {
item.style.background = "green";
a++;
} else {
antwoord.style.background = "red";
}
}
}
}
}
但是,我收到错误消息:item.value 未定义。 在控制台中,我看到该项目是输入的集合,而不是单个输入。
为什么这不起作用?
主要问题似乎在
stad.push(document.getElementsByTagName("input"));
因为这会将返回的元素集合作为单个引用推送到 stad
中(而且 HTML 集合不是真正的数组)。相反,您可以使用
stad = Array.from(document.getElementsByTagName("input"));
其次,在 if
语句的第一个分支中, antwoord
不是数组, if (antwoord.includes(item.value.toLowerCase()))
是什么意思?您可能想使用简单的比较,例如 if (antwoord === item.value.toLowerCase())
.
第三,有一处错字是Foreach
而不是forEach
。
第四,您确定要循环遍历主正确答案数组中每个条目的所有输入框吗?每个输入框不都对应一个特定的问题,有特定的正确答案或一组正确答案吗?
document.getElementsByTagName
不是 return 一个数组,它 return 是一个活动的 HTML 集合,不能迭代使用 forEach,尽管您可以通过索引号 (https://developer.mozilla.org/en-US/docs/Web/API/document/getElementsByTagName).
引用其元素
此外,您然后将整个集合作为一个项目推送到 stad
数组,这就是为什么您看到 item
是输入的集合——该集合(实时 HTML 元素) 是 stad
数组中的 只有 项。
正如另一个答案所建议的,不是使用 stad.push
,而是通过从集合中创建一个数组来简单地将一个真正的数组分配给 stad
:
stad = Array.from(document.getElementsByTagName("input"));