Найти элемент в массиве на основе текста - PullRequest
1 голос
/ 29 марта 2012

У меня есть массив объектов в известном формате, он может выглядеть следующим образом:

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?"
             }];

Я хочу создать на своей странице некоторую возможность поиска, которая будет искать разные вещи внутри элементов и позже отображатьэто в некотором роде.Кто-нибудь знает плагин, который мог бы помочь мне с этим?

Я просто пытался использовать функцию 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, оно должно располагаться выше в массиве «matched».

Так что, если у кого-то есть хороший ввод или хороший плагин, я найду его полезным!

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Вы можете использовать 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;
});          

1006 *

1 голос
/ 29 марта 2012

Вы можете использовать метод 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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...