jQuery匹配JSON对象的部分文本

jQuery match partial text of JSON object

本文关键字:文本 对象 匹配 JSON jQuery      更新时间:2023-09-26

我正在为我的网站做实时搜索结果功能。我有一个JSON对象,其中包含我希望与输入值匹配的关键字。

我能想到的最好的解决方案是在循环中迭代每个项,并使用jQuery选择器查找部分匹配。我怎样才能做出这样的if语句?例如:

$.getJSON('jsonfile.json', function(data) {
    key = Object.keys(data);
    for(i=0;i<key.length;i++)
    {
        if($(input[value]:contains == key[i].term)
        {
            //do something
        }
    }
} 

编辑:我很抱歉说不清楚。我使用:contains选择器对一个输入的值进行部分匹配。

您需要将:contains选择器构建为字符串:

if($('input[value]:contains("' + key[i].term + '")').length) {
    //do something
}

选择器将返回输入中包含术语的所有元素;添加.length为if语句提供了一个简单的"truthy"值以进行求值(返回0项="false",返回>0项="true")。

EDIT:我不确定input[value]:contains()是否是有效的jQuery选择器,因为我不知道:contains()在输入元素上看到什么文本。您可能需要通过自己检查每个输入的来帮助它。您可以将找到的输入筛选为值包含您正在搜索的术语的输入:

if ($('input[value]').filter(function() {
        return $(this).val().indexOf(key[i].term) != -1;
    }).length) {
    //do something
}

如果你有很小的项目(比如几十个),你可以创建一个匹配它们的正则表达式:

var match = keys.join("|")
var regexp = RegExp.new(match, 'i') // Case insensitive
if($(input).val().match(regexp)) {
    // do stuff
}

是的,我知道这不会搜索任何与术语匹配的输入,你必须提前知道输入元素,但根据你的问题,我认为你想检查一个输入元素。

不知道它是否比循环所有术语并逐个检查更快,但我认为它确实更快,而且绝对更可读。

这可以与jQuery的grepeach方法结合使用:

var match = keys.join("|")
var regexp = RegExp.new(match, 'i')
// With grep
var matches = $('input').grep(function(elem, idx) {
    return $(input).val().match(regexp) != null;
})
// Or with each
$('input')..each(function(idx, elem) {
    if ($(input).val().match(regexp) != null) {
        // Do stuff
    }
});

grep选择与任何搜索项匹配的所有输入字段以供以后使用,each对所有元素进行迭代以立即对其进行操作。