2012-06-12 59 views
1

我正在研究一個搜索功能,該搜索功能可以找到搜索與藝術家姓名和曲目名稱匹配的歌曲。如果這個話題引起你的興趣,並有一個理想的解決方法,你的意見將不勝感激。與編程知識問題相比,這更像是一個邏輯問題。查找匹配搜索的歌曲(藝術家和/或曲目名稱)

這是我目前的代碼。

searchPlaylist: function(a,b){ 
    var retArr = []; 
    if (typeof a === 'string') a = eval(a); 
    $.each(b, function(i,v){ 
     if (typeof v['id'] !== "string" || typeof v['artist'] !== "string" || typeof v['track'] !== "string") return; 
     var artist = v['artist'].replace(/[^a-zA-Z 0-9]+/g,'').replace(' ',' ').replace(' ',' '); 
     var track = v['track'].replace(/[^a-zA-Z 0-9]+/g,'').replace(' ',' ').replace(' ',' '); 
     if (artist.match(a) || track.match(a)) retArr.push(i); 
    }); 
    aC.searchLength = retArr.length; 
    return retArr; 
} 

這裏是我如何調用函數。

doSearch: function(){ 
    var val = $.trim($("#sB").val().replace(/[^a-zA-Z 0-9]+/g,'').replace(' ',' ').replace(' ',' ')); 
    if (1 < val.length && val != search) { 
     aC.search = val; 
     var rlength = aC.searchLength; 
     aC.searchResults = aC.searchPlaylist("/" + aC.search + "/i", aC.playlist); 
     if (aC.searchLength > 0) $("#sresultcount").text(aC.searchLength); 
     if (rlength != aC.searchLength) { 
      aC.loadPlaylist($.grep(aC.playlist, function(v,i){ 
       return $.inArray(i,aC.searchResults) > -1; 
      })); 
     }   
    } else if (0 == val.length) { 
     aC.search = ""; 
     aC.searchLength = 0; 
     $("#sresultcount").empty(); 
     aC.loadPlaylist(aC.playlist); 
    } 
} 

aC.searchPlaylist函數傳遞一個RegEx語句用於搜索,第二個參數是存儲播放列表的數組的變量。

這裏是播放列表數組的結構。

aC.playlist = [ 
    {"id":"bd6ve0ydHVo","artist":"0SM","track":"The Landing feat. Alex G - Original Mix","img":"http://i.ytimg.com/vi/bd6ve0ydHVo/default.jpg","duration":322}, 
    {"id":"KIijaPllLNI","artist":"2 Chainz","track":"No Lie - Explicit Version","img":"http://i.ytimg.com/vi/KIijaPllLNI/default.jpg","duration":240}, 
    {"id":"esBlVulbkQQ","artist":"2 LIVE CREW","track":"We Want Some P--sy","img":"http://i.ytimg.com/vi/esBlVulbkQQ/default.jpg","duration":170}, 
    {"id":"5sc_nQiuDN0","artist":"2 LIVE CREW","track":"Face Down A-- Up","img":"http://i.ytimg.com/vi/5sc_nQiuDN0/default.jpg","duration":115}, 
    {"id":"42vxicGNumM","artist":"2 LIVE CREW","track":"Me So Horny","img":"http://i.ytimg.com/vi/42vxicGNumM/default.jpg","duration":284}, 
    {"id":"42boE4fc5X4","artist":"2 LIVE CREW","track":"Hoochie Mama","img":"http://i.ytimg.com/vi/42boE4fc5X4/default.jpg","duration":180}, 
    {"id":"sNRa1M39RRY","artist":"2Pac","track":"I Ain't Mad At Cha","img":"http://i.ytimg.com/vi/sNRa1M39RRY/default.jpg","duration":233}, 
    {"id":"2cjv7hEAytU","artist":"2Pac","track":"Me Against The World","img":"http://i.ytimg.com/vi/2cjv7hEAytU/default.jpg","duration":283}, 
    {"id":"8p9jSRxguAA","artist":"2Pac","track":"Ambitionz Az A Ridah","img":"http://i.ytimg.com/vi/8p9jSRxguAA/default.jpg","duration":276}, 
    {"id":"W69SSLfRJho","artist":"2Pac","track":"Life Goes On","img":"http://i.ytimg.com/vi/W69SSLfRJho/default.jpg","duration":302}, 
    {"id":"W6S7dAsIzIU","artist":"2Pac","track":"All Eyez On Me","img":"http://i.ytimg.com/vi/W6S7dAsIzIU/default.jpg","duration":318}, 
    {"id":"khkx7yXzGhc","artist":"2Pac","track":"2 Of Amerikaz Most Wanted - (Explicit)","img":"http://i.ytimg.com/vi/khkx7yXzGhc/default.jpg","duration":316} 
]; 

這是我在想結果應該是。

搜索條件可能是下列之一:

現場工作人員 - 想要一些 OR 現場工作人員想要一些

我一般比較喜歡第二種選擇,因爲我刪除特殊字符,所以第一個例子中的連字符將被刪除。

正如您所知道的窘境,一旦你基於空間應該如何在藝術家搜索或跟蹤名稱分割字符串成數組。 (我不認爲這是搜索所有可用的組合是個好主意。)提前

HnS Music Discovery

感謝。您的意見將不勝感激。

+0

究竟是什麼,你的問題? – jrummell

+1

搜索第一個單詞,組裝一串匹配。然後搜索該數組中的下一個單詞並丟棄所有非匹配項。重複,直到搜索到所有單詞。 – Blazemonger

+0

我正在使用搜索功能來查找搜索與藝術家姓名和曲目名稱匹配的歌曲。現在,如果你搜索「現場工作人員想要一些」沒有結果會出現。我正在思考一種我可以搜索的方法,它將導致藝術家2 LIVE CREW與它的歌曲「我們想要一些P - sy」相匹配。希望澄清我的問題。 –

回答

0
searchPlaylist: function(a,b){ 
    var retArr = [], search = a.split(' '); 
    $.each(b, function(i,v){ 
     if (typeof v['id'] !== "string" || typeof v['artist'] !== "string" || typeof v['track'] !== "string") return; 
     var artist = v['artist'].replace(/[^a-zA-Z 0-9]+/g,'').replace(' ',' ').replace(' ',' '); 
     var track = v['track'].replace(/[^a-zA-Z 0-9]+/g,'').replace(' ',' ').replace(' ',' '); 
     var song = artist + " " + track; 
     var rg = new RegExp('^(?=.*?'+search.join(")(?=.*?")+')',"i"); 
     if (song.match(rg)) retArr.push(i); 
    }); 
    aC.searchLength = retArr.length; 
    return retArr; 
} 
+0

/^(?=.*?term1)(?=.*?term2)/i –

相關問題