jQuery如何在each()中提前查看

jQuery how does one peek ahead in each()?

本文关键字:each jQuery      更新时间:2023-09-26

我似乎找不到确切的答案。考虑以下内容:

var dupe = false;
    $(".syndUID").sort(function(a,b) {
        return a - b;
    }).each(function(i, el) {
        alert($(this).val() + " - " + $(this).next().val());
        if($(this).val() == $(this).next().val()) {
                dupe = true;
                return;
        };
    });

此代码试图在syndUID类的一组输入中查找重复值。它们分散在一个窗体中,因此在DOM中不相邻。

但是next().val()总是未定义的。我用错函数了吗?我如何简单地向前看下一个元素?我可以访问索引,但我甚至不知道如何使用它。

编辑:

在阅读了评论和答案后,我意识到jQuery中真的没有合适的迭代器,这对我来说真的很愚蠢,因为它提供了each()。我在上面的代码中也有另一个错误。以下是我使用的有效的最终解决方案:

// duplicate check
    var dupe = false;
    var prevVal = undefined;
    $(".syndUID").sort(function(a,b) {
        return $(a).val() - $(b).val();
    }).each(function() {
        if($(this).val() == prevVal) {
            dupe = true;
            return false;
        }
        prevVal = $(this).val();
    });

对于任何通过谷歌找到这一点的人来说,其他人提供的答案可能是一个不错的替代解决方案,但对于我的需求,我发现这已经足够了。

您可以执行类似$('.syndUID')[i+1]的操作来重新标记列表,将重点放在该元素上(并可以选择将其返回为jQuery对象)

使用[i+1]将返回DOM元素,但可以使用.eq(i+1)返回jQuery对象。或者,如果您讨厌未来的开发人员,请将DOM元素封装在$()中,因为它的可读性太差了!

正如安德里亚斯所说,重新编制这份名单是在浪费记忆。在循环之前,使用var element = $('.syndUID')将对象缓存到一个变量中,这样就不会对DOM进行太多迭代。

next()获取下一个同级,而不是下一个祖先或父级。

例如,如果我们有一个无序列表,next()的工作原理如下:

var a = $('#listone.first').next().val();
console.log(a) //outputs "Second"
<ul id="listone">
<li class="first">First</li>
<li class="second">Second</li>
</ul>
<ul id="listtwo">
<li class="third">Third</li>
<li class="fourth">Forth</li>
</ul>

因此,如果您正试图获取下一个父级,则应用于.next()的.val()将不起作用。我不知道你的输出是什么(表、UL、DIV等),所以很难给你一个有效的解决方案,但这可能是你的问题。您没有正确地遍历DOM。

好吧,你已经有了排序的数组,也许你不想用.each()来做这件事,而只是使用一个简单的for循环?

var elemArray = $(".syndUID").sort(function(a,b) {
    return a - b;
});
for(var i = 0; i < elemArray.length; i++){
    if(elemeArray[i].value == elemArray[i+1].value){
       //do something with comparison
    }
}

但是,这只会在数组中的下一个syndUID元素中检查重复项。为了进行完整的搜索,您需要对照数组中的每个元素(不包括其本身)来检查每个元素。这将涉及一个嵌套循环,它将向函数添加n^2的顺序