2011-11-21 100 views
2

我在内存客户端有50-100个对象。我需要在没有标签的情况下搜索它们,只需搜索对象的每个字段并查找匹配或部分匹配即可。通过对象,客户端搜索?

做这种类型的搜索的最佳方式是什么,我如何根据相关性列出它们?

回答

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()) != -1v.toLowerCase() == search.toLowerCase()
+0

我想只是搜索文本值会很好,搜索到的子对象将是理想的。 – fancy

+0

更新了我的回答 – Niels

+0

嗯,非常好,基本的相关性将基于它被发现的时间?我猜测可能有更好,更复杂的方法来创建相关性,比如精确的单词匹配比部分匹配更值得,但这是一个很好的开始。谢谢。 – fancy

0

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

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

+0

这样的声音是在正确的方向。我如何预制我的'匹配',以及它如何返回相关性分数? – fancy

+0

哦,我想你已经有了一个匹配算法,只是想知道如何提取值并使用JavaScript对它们进行排序。你需要什么样的匹配?简单的文字相似? –

+0

是的,在文本字段中搜索匹配或部分匹配。谢谢。 – fancy

相关问题