Найдите песню, которая соответствует поиску (исполнитель и/или название трека)

Я работаю над функцией поиска, которая находит песню, где поиск соответствует имени исполнителя и названию трека. Если эта тема вас интересует и у вас есть идеальный метод ее решения, ваш вклад будет принят с благодарностью. Это больше логический вопрос, чем вопрос о знании программирования.

Вот мой текущий код.

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

Вот какие, я думаю, должны быть результаты.

Ключевой запрос может быть одним из следующих:

живая команда — хочу немного ИЛИ живая команда хочет немного

Обычно я предпочитаю второй вариант, потому что я удаляю специальные символы, чтобы убрать дефис в первом примере.

Как вы можете решить дилемму, как только вы разделите строку на массив на основе пробелов, как мы будем искать по исполнителю или названию трека. (Я не думаю, что это хорошая идея, чтобы искать все доступные комбинации.)

HNS Music Discovery

Заранее спасибо. Ваше мнение будет оценено.


person Andrew    schedule 12.06.2012    source источник
comment
В чем именно заключается ваш вопрос?   -  person jrummell    schedule 12.06.2012
comment
Найдите первое слово, соберите массив совпадений. Затем найдите следующее слово в этом массиве и отбросьте все несоответствия. Повторяйте, пока не будут найдены все слова.   -  person Blazemonger    schedule 12.06.2012
comment
Я работаю над функцией поиска, которая находит песню, где поиск соответствует имени исполнителя и названию трека. Прямо сейчас, если вы ищете живую команду, вы не получите никаких результатов. Я обдумываю метод, с помощью которого я могу искать, и это приведет к совпадению исполнителя 2 LIVE CREW вместе с его песней We Want Some P-sy. Надеюсь, это прояснит мой вопрос.   -  person Andrew    schedule 12.06.2012
comment
@Blazemonger спасибо за предложение. Я воспользуюсь этим, если мы не придумаем более крутое решение. Я надеялся на решение, использующее RegEx или решение без циклов.   -  person Andrew    schedule 12.06.2012
comment
@Blazemonger Думаю, я наконец понял, почему я опасался этого метода. Скажем, вы ищете команду в прямом эфире. Если вы сначала ищете команду, у вас будет четыре результата. Затем, если вы будете искать в них результаты для live, они будут соответствовать тем же четырем результатам. Фактически не обращая внимания на порядок.   -  person Andrew    schedule 13.06.2012
comment
В большинстве случаев это не должно быть проблемой. Я думаю, вы пытаетесь предоставить гораздо более сложный и интеллектуальный инструмент поиска, чем требуется для вашей ограниченной базы данных.   -  person Blazemonger    schedule 13.06.2012