根据文本在数组中查找项目

时间:2012-03-29 10:32:50

标签: javascript jquery jquery-plugins

我有一个已知格式的对象数组,它看起来像这样:

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;
});

http://jsfiddle.net/Az2rA/1/

这很直接且有效。然而,它不能解决优先级不同的属性。如何为该功能添加优先级。例如,如果在标题中找到serach表达式,它应该在“匹配”数组中更高。

因此,如果任何人有任何好的输入或良好的插件,我会觉得它很有帮助!

2 个答案:

答案 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;
});