jQuery如何在每个()中向前看?

时间:2015-12-22 17:12:27

标签: javascript jquery

我似乎无法找到明确的答案。请考虑以下事项:

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

对于通过谷歌发现此问题的任何人,其他人提供的答案可能是一个不错的替代解决方案,但根据我的需要,我发现这已经足够了。

3 个答案:

答案 0 :(得分:3)

您可以执行类似$('.syndUID')[i+1]的操作来重新列出列表,专注于该元素(并可选择将其重新转换为jQuery对象)

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

正如安德烈亚斯所说 - 重新列入名单是浪费记忆。在循环之前,将对象缓存到具有var element = $('.syndUID')的变量中,这样您就不会对DOM进行如此多的迭代。

答案 1 :(得分:-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()将不起作用。我不知道你输出什么(表,UL,DIV等)所以很难给你一个有效的解决方案 - 但这可能是你的问题。您没有正确遍历DOM。

答案 2 :(得分:-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的顺序