【问题标题】:jQuery how does one peek ahead in each()?jQuery 如何在 each() 中窥视?
【发布时间】:2016-03-29 00:40:03
【问题描述】:

我似乎无法为此找到明确的答案。考虑以下几点:

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() 虽然总是未定义。我使用了错误的功能吗?我如何简单地窥视下一个元素?我可以访问索引,但我什至不知道如何使用它。

编辑:

阅读 cmets 和答案后,我意识到 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();
    });

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

【问题讨论】:

  • next() 将获得下一个兄弟元素,不一定是匹配集中的下一个元素。
  • 所以我们得到了这个问题:stackoverflow.com/questions/3670136/….
  • 你只想知道是否有重复值?至少这就是代码所暗示的(对我而言)
  • 你到底想做什么?我们有很多选择,也有很多未知数。是否可以有超过 1 个重复项,您是否只是想在有重复项时警告用户?

标签: javascript jquery


【解决方案1】:

您可以执行$('.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); ... }
  • 这是一个有点笨拙的方法来继续抓取相同的列表。将其设置为 var,然后将索引应用于变量,以便您保持缓存列表 - 根据需要从列表中添加或删除。
【解决方案2】:

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。

【讨论】:

  • 一个有效的观察,但这并不能真正回答问题。
  • 是的,我知道。我需要知道他/她试图从中获取价值的结构,以便我可以通过解决他/她的问题来编辑我的答案。我只是指出他获取元素值的方法的问题。这可能应该是评论,而不是答案。
【解决方案3】:

好吧,您已经有了排序数组,也许您不必尝试使用 .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 标志。
  • @JᴀʏMᴇᴇ 本站不完全重写代码。只是试图将 OP 指向正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多