仅返回过滤器的第二个匹配项

时间:2018-03-22 13:44:49

标签: javascript jquery

我有一个在两个不同页面上运行的脚本。它所做的就是找到带有文本UID的div旁边的特定div的文本。请注意,我无法编辑相关网页的实际内容,否则我只会将这些类或ID直接定位到目标网页。

$(document).ready(function() {
    var uid = $('div.label').filter(function() {
        return $(this).text() == 'UID';
    }).next().text();
    $('.column.right.top-ribbon-nav, .client_custom_fields_container').append(function() {
            return '<a target="_blank" class="top-nav-item pLink" style="color: red" href="https://www.xxxxxxx.com/private/index.html?content=admin2&page=userdetails&id=' + uid + '">User Page</a>';
        }
    });
    $('.pLink').on('click', function() {
        if(uid == '~') {
            alert('No UID is present for this contact. Please add it and try again.');
            return false;
        }
    });
});

这可以按预期工作,但在我使用它的两个页面之一上,实际上有两个匹配该变量。因此,在该页面上,它将获取两个结果并将它们相加,以便变量uid与UID1和UID2匹配并变为UID1UID2。

在这个例子中,我实际上只想要第二场比赛。

我的想法是添加一个条件,首先确定该变量是否有多个结果。我相信我错误地认为我可以做if uid.length > 1,因为uid实际上是返回容器匹配的文本,而不是容器本身。然后我尝试使用indexeq获取1,这将是我的第二个结果。

我对javascript和jquery都很陌生,并且认为我可能误解了一些基本的错误。

编辑:我发现我只是在错误的位置使用.eq()。这是我的工作代码:

$(document).ready(function() {
    var uid = $('div.label').filter(function() {
        return $(this).text() == 'UID';
    }).next().text();
    $('.column.right.top-ribbon-nav, .client_custom_fields_container').append(function() {
        if (uid.length > 1) {
            var uid2 = $('div.label').filter(function() {
                return $(this).text() == 'UID';
            }).eq(1).next().text();
            return '<a target="_blank" class="top-nav-item pLink" style="color: red" href="https://www.xxxxxxxx.com/private/index.html?content=admin2&page=userdetails&id=' + uid2 + '">User Page</a>';
        } else {
            return '<a target="_blank" class="top-nav-item pLink" style="color: red" href="https://www.xxxxxxxx.com/private/index.html?content=admin2&page=userdetails&id=' + uid + '">User Page</a>';
        }
    });
    $('.pLink').on('click', function() {
        if(uid == '~') {
            alert('No UID is present for this contact. Please add it and try again.');
            return false;
        }
    });
});

2 个答案:

答案 0 :(得分:2)

您可以获得过滤功能的结果

var uid = $('div.label').filter(function() {
    return $(this).text() == 'UID';
});

然后获取此结果的最后一项

var unique = uid[uid.length-1];

然后你就可以在这个对象上做你想做的事了

unique.text()...

答案 1 :(得分:0)

我觉得这是最好的选择,而且更容易阅读。

您可以在初始过滤器后使用.last().first()来获取始终最后一个或第一个过滤器。

如果它始终是第二场比赛而不是第三场比赛,你也可以使用.eq(1)

var uid = $('div.label').filter(function() {
  return $(this).text() == 'UID';
}).last().next().text();