2012-03-29 1 views
1

に基づいて配列内のアイテムを検索し、それは次のようになります。私が知られている形式のオブジェクトの配列を持っているテキスト

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私のページでいくつかの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式が見つかった場合は、 "matched"配列の上位に追加する必要があります。

誰かが良い入力や良いプラグインを持っているなら、私はそれが役に立つと思います!

+0

タイトルマッチがどれくらい良いですか? 10回? 100回?あなたがそれを知っているなら、あなたは単純に重みを加算し、結果を重みでソートすることができます。 – devsnd

+0

はい、私はそれについても厳しいです。しかし、grep関数を使用すると、私が戻ったときに重みプロパティを追加することはできません。だから私はおそらく私はちょうどこのapprochで間違っているtought。 –

答えて

1

:その後、優先度の値の配列をソートすることができます。このよう

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

1

mapメソッドを使用すると、検出された各オブジェクトを優先度の値とともに別のオブジェクトにラップすることができます。あなたは、各試合の重みと、その後の並べ替えでjQuery.eachを作成し、配列を使用することができます

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