【问题标题】:Searching through objects, client-side?搜索对象,客户端?
【发布时间】:2026-01-17 10:45:01
【问题描述】:

我在内存客户端中有 50-100 个对象。我需要在没有标签的情况下搜索它们,只需文本搜索对象的每个字段并找到匹配项或部分匹配项。

进行此类搜索的最佳方式是什么?如何根据相关性列出它们?

【问题讨论】:

    标签: javascript jquery coffeescript


    【解决方案1】:

    元素:

    如果你想在元素中查找文本,试试这个:

    $(":contains('your text')");
    

    这将返回每个包含your text 的元素。

    对象

    查看此演示:http://jsfiddle.net/datyn/1/

    也搜索子对象,目前搜索不区分大小写,如果要更改,只需删除.toLowerCase()函数即可:

    var ob = {
        User : {
            name : "Niels",
            country : "Netherlands"
        },
        Name : "Niels test X"
    }
    
    function find_match(search, results)
    {
        $.each(this, function(k, v){
           if( typeof(v) == "object" )
           {
                find_match.call(v, search, results);  
           }
            else
            {
                 if( v.toLowerCase().indexOf(search.toLowerCase()) != -1)
                 {
                     if($.inArray(this, results) == -1)
                     {
                         results.push(this);
                     }   
                 }
            }
        });
    }
    
    var results = [];
    find_match.call(ob, "x", results);
    alert("Search for x results: " + results.length);
    var results = [];
    find_match.call(ob, "n", results);
    alert("Search for n results: " + results.length);
    

    您可以使用.call 方法调用该函数。

    例子:

    find_match.call("Object / array you want to search", "The string", "Array where the results will be stored")
    

    变化:

    1. 如果您不想匹配字符串的一部分,请将:v.toLowerCase().indexOf(search.toLowerCase()) != -1 更改为 v.toLowerCase() == search.toLowerCase()

    【讨论】:

    • 我想只搜索文本值就可以了,搜索子对象是理想的。
    • 啊,非常好,基本相关性将基于它被发现的次数?我猜可能有更好、更复杂的方法来创建相关性,比如完全匹配比部分匹配更有价值,但这是一个很好的开始。谢谢。
    • 如果你想有特定的匹配,你可以将indexOf更改为if(v.toLowerCase() == search.toLowerCase())
    • 太棒了,我会用这个。知道任何研究或可以将更多逻辑推入方程式的库吗? a, the, is, 匹配的意义不大,还有其他怪癖,如何衡量什么,等等?
    • 它目前不会将您的搜索字符串拆分为不同的可能匹配项,如果您得到字符串My name is,它将找到包含字符串My name is的匹配项,而不是查找每个单词。
    【解决方案2】:

    你可能想看看这个:

    http://goessner.net/articles/JsonPath/

    【讨论】:

      【解决方案3】:

      对于集合中的每个对象(我假设它们可能保存在一个数组中,或者是 jQuery 选择的结果),使用 Object.keys 获取属性名称,然后获取关联的值并执行您的匹配。

      由于您的匹配返回相关性分数,您可以将所有匹配项放入一个配对数组中(匹配 x 分数),并使用比较器集进行数组排序以按分数进行比较。

      【讨论】:

      • 听起来方向正确。但是,我如何执行我的“匹配”,以及它如何返回相关性分数?
      • 哦,我以为您已经想到了匹配算法,只是想知道如何提取值并使用 JavaScript 对其进行排序。你需要什么样的匹配?简单的文本相似度?
      • 是的,搜索匹配或部分匹配的文本字段。谢谢。
      • 一个简单的匹配过程,不考虑相关性:jsfiddle.net/aeDrx