jQuery如何在each()中预览下一个元素?

8

我似乎找不到一个确定的答案。请考虑以下内容:

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 的一组输入中的重复值。它们散布在表单中,因此不相邻。

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();
    });

如果有人通过谷歌找到这篇文章,其他人提供的答案可能是一个不错的替代方案,但对于我的需求,我发现这个已经足够了。


3
next() 方法将获取下一个兄弟元素,而不一定是匹配集合中的下一个元素。 - Rory McCrossan
所以我们来到了这个问题:https://dev59.com/GnA65IYBdhLWcg3wuRF8。 - nicael
1
你只想知道是否存在重复的值?至少这是代码所暗示的(对我来说)。 - Andreas
你究竟想做什么?对我们来说,有许多选项和未知数。是否可能存在超过1个重复项,你只是想在有重复项时警告用户吗? - Adjit
3个回答

3
您可以像这样做:$('.syndUID')[i+1]来重新获取列表并关注该元素(可选地将其转换回jQuery对象)。
使用[i+1]将返回DOM元素,但是您可以使用.eq(i+1)返回jQuery对象。或者,如果您讨厌未来的开发人员,请在$()中包装DOM元素,因为它会影响可读性!
正如Andreas所说 - 重新获取列表会浪费内存。在循环之前,使用var element = $('.syndUID')将对象缓存到变量中,以便不需要频繁迭代DOM。

那么对于 $('.syndUID') 中的每个元素,您都要再次获取所有类为 syndUID 的元素吗?O.o var elements = $('.syndUID'); elements.each(function(i, el) { var nextElement = elements.eq(i + 1); ... } - Andreas
1
这是一种有点笨拙的方法来不断获取相同的列表。将其设置为变量,然后对变量应用索引,以便您保留缓存列表 - 根据需要添加或删除列表项。 - Korgrue

-1

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() 是行不通的。我不知道你的输出是什么(表格、无序列表、DIV 等等),所以很难给你一个可行的解决方案 - 但这很可能是你的问题。你没有正确地遍历 DOM。

这是一个有效的观点,但实际上并没有回答问题。 - j08691
是的,我知道。我需要了解他/她试图从中获取值的结构,以便我可以编辑我的答案并解决他/她的问题。我只是指出了他的元素值获取方法存在的问题。这可能应该是一条评论,而不是一个答案。 - Korgrue

-1

好的,你已经有了排好序的数组,也许不用尝试使用 .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的时间复杂度。

我写的就是那个,除了你(出于某种原因)省略了OP设置的警报。你甚至没有设置“dupe”标志。 - user1017882
@JᴀʏMᴇᴇ 这个网站不是完全重写代码的地方。只是试图指导OP朝正确的方向发展。 - Adjit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接