逻辑问题,寻求算法

时间:2010-11-02 22:40:04

标签: javascript jquery


我正在开发一些javascript过滤的一些结果,并有一些困难..
这是问题......
假设我们有一些标准

  1. Manufacter(Trusardi,Calvin Kein,Armani ......)
  2. 颜色(红色,蓝色,黑色......)
  3. OtherFeatures(goretex,blah,blah ......)
  4. 每个功能都显示为复选框...
    问题是我想禁用复选框,如果它的选择会导致没有结果。例如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 个答案:

答案 0 :(得分:1)

您可以为每个制造商,颜色等添加一个类,然后只需按类禁用。我假设这里有一个结果哈希关键制造商:

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

答案 1 :(得分:0)

您有一个分面搜索问题 - 许多组合都没有产生任何结果。我建议计算并显示如果选择给定标准会显示多少结果结果,而不是禁用。然后每次单击,再次执行该算法。所以你的搜索与newegg.com非常相似:

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

根据您处理的数据量,您可能需要考虑使用solr。

答案 2 :(得分:0)

我认为我找到了解决方案..它比我想象的更简单...我试图整天找到一个解决方案,它比我想象的更简单.. 这是....

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

这似乎是正确的。我不确定,但测试似乎没问题。

答案 3 :(得分:0)

您不能只为每个未经检查的选项计算结果,并将它们与当前足以满足的产品进行比较。 (我对jQuery不是很熟悉所以我不知道怎么......)