Javascript 我无法将for循环转换为forEach循环
我是编程新手,我想将以下for循环转换为foreach循环,这是for循环:Javascript 我无法将for循环转换为forEach循环,javascript,Javascript,我是编程新手,我想将以下for循环转换为foreach循环,这是for循环: checkLetter(letter) { //give the letter class a variable named letters to have a reference to them var letters = $('.letter'); for (var i=0; i < letters.length; i++) { console.log(letters[i]
checkLetter(letter) {
//give the letter class a variable named letters to have a reference to them
var letters = $('.letter');
for (var i=0; i < letters.length; i++) {
console.log(letters[i].innerHTML);
//if the phrase contains a letter from the phrases array return true, otherwise it will return false
if(letter === letters[i].innerHTML) {
console.log('this is true')
return true
}
else return false
}
}
但是,我最终得到了以下错误:
letters.foreach不是一个函数
有人能帮忙吗?
字母
是jQuery对象,不是数组;要在jQuery对象上循环,必须使用jQuery方法,如each
:
letters.each((i, letter) => {
// do something with `letter`
Array.prototype.forEach.call(
letters,
letter => {
// do something with `letter`
}
);
checkLetter(letterToFind) {
var letters = $('.letter');
let foundLetter = false;
letters.each((i, letterElement) => {
if ($(letterElement).text() === letterToFind) {
foundLetter = true;
}
});
return foundLetter;
}
或者调用Array.prototype.forEach
:
letters.each((i, letter) => {
// do something with `letter`
Array.prototype.forEach.call(
letters,
letter => {
// do something with `letter`
}
);
checkLetter(letterToFind) {
var letters = $('.letter');
let foundLetter = false;
letters.each((i, letterElement) => {
if ($(letterElement).text() === letterToFind) {
foundLetter = true;
}
});
return foundLetter;
}
还要注意,当前的letters.forEach(letter)
没有意义-forEach
接受回调函数作为参数
但是,对于您试图实现的目标,更适合使用Array.prototype。一些检查字母中的项目是否满足条件:forEach
更适合于通用迭代,当其他数组方法不满足时:
checkLetter(letterToFind) {
var letters = $('.letter');
return Array.prototype.some.call(
letters,
letterElement => letterElement.textContent === letterToFind
);
}
或者,使用jQuery的each
,IMO不太合适,但仍然可以工作:
letters.each((i, letter) => {
// do something with `letter`
Array.prototype.forEach.call(
letters,
letter => {
// do something with `letter`
}
);
checkLetter(letterToFind) {
var letters = $('.letter');
let foundLetter = false;
letters.each((i, letterElement) => {
if ($(letterElement).text() === letterToFind) {
foundLetter = true;
}
});
return foundLetter;
}
基于forEach()
的方法不适合您的问题,因为它会使您在forEach()
循环期间“提前返回”变得困难
也许您可以考虑使用<代码>()<代码>,如果迭代中的项满足给定条件:
,则返回true。
return node.innerHTML === letter
使用some()
,您可以通过以下方式实现checkLetter()
功能:
函数校验字母(字母){
//查询.letter节点的文档。这避免了jQuery的需要
var letters=document.queryselectoral('.letter');
//通过Array.from和将字母选择结果转换为数组
//然后调用some()确定是否至少有一个节点满足
//匹配条件“node.innerHTML==字母”
返回数组.from(字母).some(函数(节点){
return node.innerHTML==字母
})
}
log('Check A:',checkLetter('A'))
console.log('Check B:',checkLetter('B'))
console.log('Check Z:',checkLetter('Z'))
A
B
C
D
您可以使用Jquery。功能
$( ".letter" ).each(function( index ) {
if(letter === $( this ).html()) {
console.log('this is true')
return false; // this will stop the execution
}
});
既然已经给出了所有的循环答案,我将提出一种不同的方法。我建议您将所有匹配的节点.letter
转换为一个字符串,并使用它来确定是否存在匹配。例:
函数校验字母(字母){
返回$('.letter').text().indexOf(letter)>-1;
}
console.log('A',checkLetter('A'));
console.log('C',checkLetter('C'));
console.log('F',checkLetter('F'))代码>
A.
B
C
D
E
forEach是一种数组方法。我假设字母是一个字符串。forEach循环的大括号丢失这将不会产生正确的结果-$。each()
方法不会返回迭代回调的结果-请参阅上面的答案,以获取基于$的正确解决方案。each()
method:-)@DacreDenny我知道这是用于数组迭代和jQuery对象迭代的。但这里的字母实际上是一个Dom元素列表,而不是数组。不是吗?在OP中,如果在迭代过程中找到匹配项,则函数需要返回true。在$中重新调整为true。每个都无法实现此目的。很抱歉,在我的手机上键入的内容很难详细说明,但请重新阅读jQuery文档中有关传递给$的处理程序函数返回行为的内容。每个都希望有帮助:),但我认为这一部分没有问题。如果(letter==$(this.html()){console.log('this is true'),console.log将打印所需的输出。他可以使用return=false停止。请看我已经编辑了答案。我想现在毫无疑问:)。我已经在本地PC上测试了这一点。请查看checkLetter()的返回行为
在OP中-注意函数本身是如何根据找到的匹配返回true
或false
的。函数不仅仅是记录日志和提前退出for循环,还包括在找到匹配时返回true,否则返回false。感谢所有帮助我的人,我能够找到解决方案!!