我似乎无法找到明确的答案。请考虑以下事项:
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();
});
对于通过谷歌发现此问题的任何人,其他人提供的答案可能是一个不错的替代解决方案,但根据我的需要,我发现这已经足够了。
答案 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的顺序