代码之家  ›  专栏  ›  技术社区  ›  GorillaApe

逻辑问题,寻找算法

  •  3
  • GorillaApe  · 技术社区  · 15 年前


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

    1. 制造商(Trusadi、Calvin Kein、Armani…)
    2. 颜色(红色、蓝色、黑色…)
    3. 其他功能(Goretex、Blah、Blah…)

    每个功能都显示为复选框…
    问题是我想禁用复选框,如果它的选择不会导致任何结果。例如,阿玛尼的产品可能只有蓝色,所以检查阿玛尼应该禁用黑色和红色,但其他制造商不应该禁用…因为检查它们应该提供一个结果…
    这是迄今为止的密码

    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 回复  |  直到 15 年前
        1
  •  1
  •   Hogsmill    15 年前

    您可以为每个制造商、颜色等添加一个类,然后简单地按类禁用。我假设这里有一个结果散列键输出制造商:

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

    等。

        2
  •  0
  •   orangepips 111111    15 年前

    你有一个多方面的搜索问题——很多组合都不会产生结果。我建议不要禁用,而是计算并显示如果选择给定的条件,将显示多少结果。然后每次点击,再次执行该算法。因此,您的搜索与newegg.com非常相似:

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

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

        3
  •  0
  •   GorillaApe    15 年前

    我想我找到了解决办法。比我想象的简单…我一整天都在想办法,比我想的要简单。 这是……

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

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

        4
  •  0
  •   Kerstomaat    15 年前

    不能只计算每个未选中选项的结果,并将其与当前足够的产品进行比较。(我对jquery不太熟悉,所以我不知道如何…)