【发布时间】:2026-01-17 10:45:01
【问题描述】:
我在内存客户端中有 50-100 个对象。我需要在没有标签的情况下搜索它们,只需文本搜索对象的每个字段并找到匹配项或部分匹配项。
进行此类搜索的最佳方式是什么?如何根据相关性列出它们?
【问题讨论】:
标签: javascript jquery coffeescript
我在内存客户端中有 50-100 个对象。我需要在没有标签的情况下搜索它们,只需文本搜索对象的每个字段并找到匹配项或部分匹配项。
进行此类搜索的最佳方式是什么?如何根据相关性列出它们?
【问题讨论】:
标签: javascript jquery coffeescript
元素:
如果你想在元素中查找文本,试试这个:
$(":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")
变化:
v.toLowerCase().indexOf(search.toLowerCase()) != -1 更改为 v.toLowerCase() == search.toLowerCase()
【讨论】:
indexOf更改为if(v.toLowerCase() == search.toLowerCase())
My name is,它将找到包含字符串My name is的匹配项,而不是查找每个单词。
你可能想看看这个:
【讨论】:
对于集合中的每个对象(我假设它们可能保存在一个数组中,或者是 jQuery 选择的结果),使用 Object.keys 获取属性名称,然后获取关联的值并执行您的匹配。
由于您的匹配返回相关性分数,您可以将所有匹配项放入一个配对数组中(匹配 x 分数),并使用比较器集进行数组排序以按分数进行比较。
【讨论】: