我有一个已知格式的对象数组,它看起来像这样:
var items = [{id : 1,
desc : "Funny things",
tags : ["Snippet","Funny"],
title : "Awsome"},
{id : 2,
desc : "Hello World",
tags : ["Fun","Funny"],
title : "What"},
{id : 3,
desc : "True story",
tags : ["Snippet","Cool"],
title : "Is it possible with things?"
}];
我想在我的页面中创建一些serach功能,用于搜索项目中的不同内容,然后以某种方式显示它。有没有人知道一个可以帮助我的插件?
我只是尝试使用jQuery grep函数,并为我的示例提供了这个代码段:
var serach = "things"; // Try to get the tags
var obj = $.grep(items, function(n, i){
// Condition one
if(n.desc.indexOf(serach)>=0)
{
return true;
};
// Condition two
if(n.title.indexOf(serach)>=0)
{
return true;
};
// Condition there
var foundTag = false;
for(var i = 0; i<n.tags.length;i++){
if(n.tags[i].indexOf(serach)>=0)
{
foundTag = true;
return true;
};
}
if(foundTag){return true};
return false;
});
这很直接且有效。然而,它不能解决优先级不同的属性。如何为该功能添加优先级。例如,如果在标题中找到serach表达式,它应该在“匹配”数组中更高。
因此,如果任何人有任何好的输入或良好的插件,我会觉得它很有帮助!
答案 0 :(得分:1)
您可以使用map
方法将每个找到的对象与优先级值一起包装到另一个对象中。然后,您可以按优先级值对数组进行排序:
var search = "things";
var obj = $.map(items, function(n, i){
if (n.desc.indexOf(search) != -1) {
return { obj: n, p: 1 };
};
if (n.title.indexOf(search) != -1) {
return { obj: n, p: 2};
};
for (var i = 0; i < n.tags.length; i++) {
if (n.tags[i].indexOf(search) != -1) {
return { obj: n, p: 3}
};
}
return null;
});
obj.sort(function(a, b) {
return a.p == b.p ? 0 : a.p < b.p ? -1 : 1;
});
答案 1 :(得分:1)
你可以使用jQuery.each创建和数组,每个匹配的权重,然后排序。
像这样:
//var serach = "Fun"; Try the tags
var serach = "things"; // Try to get the tags
var obj = [];
$.each(items, function(i, n) {
// Condition one
if(n.desc.indexOf(serach)>=0)
{
obj.push({ weight: 0, value: n });
};
// Condition two
if(n.title.indexOf(serach)>=0)
{
obj.push({ weight: 10, value: n });
};
// Condition there
var foundTag = false;
for(var i = 0; i<n.tags.length;i++){
if(n.tags[i].indexOf(serach)>=0)
{
foundTag = true;
obj.push({ weight: 5, value: n });
};
}
if(foundTag){
obj.push({ weight: 5, value: n });
};
});
obj.sort( function(a, b) {
return a.weight < b.weight;
});