Логическая задача, поиск алгоритма



Я разрабатываю javascript-фильтрацию некоторых результатов и испытываю некоторые трудности..
Вот в чем проблема...
Предположим, что у нас есть некоторые критерии

  1. Manufacter (Trusardi, Калвин Кейн, Армани...)
  2. Цвет (красный, синий, черный...)
  3. другие функции (goretex, бла, бла...)

Каждая функция отображается в виде флажка...
Проблема в том, что я хочу отключить флажки, если их выбор не приведет ни к каким результатам..Например Продукция Armani может иметь только синий цвет, поэтому проверка armani должна отключить черный и красный, но другие производители не должны быть отключены... так как проверка их должна дать результат...
Вот код до сих пор

results = $("#products li");
results.hide();
var filtersGroup = $("#filters li.filtersGroup");

$("#filters li.filtersGroup a").removeClass("disabled");
filtersGroup.each(function(index) {
    var classes = "";

    $(this).find("a.checked").each(function(index) {
        classes = classes + "." + $(this).attr("id") + ",";
    });
    if (classes == "") return true;

    results = results.filter(classes.substr(0, classes.length - 1));
    //periorismos
    filtersGroup.not($(this)).each(function(index) {
        $(this).find("a").each(function(index) {
            if (results.filter("." + $(this).attr("id")).length <= 0) {
                $(this).removeClass("checked").addClass("disabled");
            }
        });
    });
});

Хотя он успешно фильтрует их, отключение не всегда корректно. например, чтобы воспроизвести проблему, если вы выберете все мануфакторы, а затем выберете цвет, мануфакторы будут отключены, но цвета не в первый раз..
Я решил, что есть одно решение. заключается в создании нескольких результатов, которые имитировали бы все последующие возможные проверки.(если 16 признаков и 4 проверенных означает 12 возможных других проверенных ..
Но я думаю, что такой подход отстой... Есть еще идеи?

4   3  

4 ответа:

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

results['Trusardi'] = 5 
results['Armani' = 0

..затем:

$("#filters li.filtersGroup a").addClass("disabled");
foreach (m in manufacturers) {
    if (manufacturers[m] > 0) {
       $("#filters li.filtersGroup a." + m).removeClass("disabled");
   }
}

И т. д.

У вас есть проблема фасетного поиска - где многие комбинации не дают никаких результатов. Вместо того чтобы отключать, я предлагаю вычислить и показать, сколько результатов появится, если выбран данный критерий. Затем с каждым щелчком мыши, выполняя этот алгоритм снова. Так что ваш поиск хотел бы очень похож на newegg.com:

Http://www.newegg.com/Store/SubCategory.aspx?SubCategory=10&name=Desktop-PCs

В зависимости от того, с каким объемом данных вы имеете дело, вы можете захотеть рассмотрите возможность использования solr.

Я думаю, что нашел решение.. Все оказалось проще, чем я думал... Я весь день пытался найти решение, и оно оказалось проще, чем я думал.. Вот оно....

 results=$("#products li");
            results.hide();
            var groupClasses=[];
            var groupsChecked=0;

        var filtersGroup=$("#filters li.filtersGroup");

        $("#filters li.filtersGroup a").removeClass("disabled");
        filtersGroup.each(function(index) {
            var classes="";

            $(this).find("a.checked").each(function(index) {
                classes=classes+ "." + $(this).attr("id") +",";
            });

            groupClasses[groupClasses.length]=classes;
            if(classes=="") return true;
            groupsChecked++;
            results=results.filter(classes.substr(0,classes.length-1));

        });
        //disable
        var gi=0;
        filtersGroup.each(function(index) {
            if( ! (groupsChecked<=1 && groupClasses[gi]!=""))
                {
                    $(this).find("a").not(".checked").each(function(){
                         if (results.filter("." + $(this).attr("id")).length <= 0) {
                             $(this).removeClass("checked").addClass("disabled");
                         }
                    });
                }

            gi++;
        });

Кажется, это правильно. Я не уверен, хотя, но тестирование кажется нормальным..

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