Логическая задача, поиск алгоритма
Я разрабатываю javascript-фильтрацию некоторых результатов и испытываю некоторые трудности..
Вот в чем проблема...
Предположим, что у нас есть некоторые критерии
- Manufacter (Trusardi, Калвин Кейн, Армани...)
- Цвет (красный, синий, черный...)
- другие функции (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 ответа:
Вы можете добавить класс для каждого производителя, цвета и т. д. затем просто отключите по классам. Я предполагаю, что здесь есть хэш результатов, отключенный производителем:
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++; });
Кажется, это правильно. Я не уверен, хотя, но тестирование кажется нормальным..