如何为multifilter构建jquery选择器?

时间:2013-08-04 04:03:36

标签: javascript jquery foreach

我需要将过滤器应用于项目集合中的n个类别。每个分类都有2到5个子类别。这是:

Category a: a1, a2
Category b: b1, b2, b3
Category c: c1, c2
Category d: d1, d2 d3
Category e: e1, e2, e3, e4, e5

我的项目列表包含以下类:

class="a1 c4 e5"

每个项目只能属于每个类别的一个子类别。

使用jquery我可以选择相同类别(联合)中的项目,如下所示:

$(".b1, .b2")

来自差异类别(交集)的项目如下:

$(".a2.b3.d1")

这是我的问题:

如果我选择子类别列表:

mylist = [a1, b1, b3, d2, e2, e4, e5]

最终选择器将有6组元素(来自mylist,相同类别元素的乘积:1 x 2 x 1 x 3 = 6),用逗号分隔,每组4个元素(mylist指4个类别: a,b,d和e)。这是:

myselector = $(.e2.b1.a1.d2, 
               .e4.b3.a1.d2, 
               .e5.b1.a1.d2, 
               .e2.b3.a1.d2, 
               .e4.b1.a1.d2, 
               .e5.b3.a1.d2)

我不知道如何编写一个在myselector中转换mylist的函数。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我有一个想法如下:

  1. 使用键构建哈希表是类别,值是包含在myList数组中的子类别数组。
  2. 递归遍历构建的数组并构建所有可用组合。
  3. 以下是代码和演示on JsBin

    // The list of all sub categories
    myList = [".a1", ".b1", ".b3", ".d2", ".e2", ".e4", ".e5"];
    
    // The function to get the category of a particular subcategory
    function getCategory(subCat){
        return subCat.substr(1, 1);
    }
    
    
    // The function to build our selector recursively
    function buildSelector(categoryList, categoryIndexArray, categoryIndex)
    {
        if (categoryIndex == categoryIndexArray.length - 1)
            return categoryList[categoryIndexArray[categoryIndex]];
        else {
            var results = [];
            var subList = buildSelector(categoryList, categoryIndexArray, categoryIndex + 1);
            $.each(categoryList[categoryIndexArray[categoryIndex]],function(_,e){
                $.each(subList,function(_,e1){
                    results.push(e + e1);
                });
            });
            return results;
        }
    }
    
    var categories = {}; 
    var categoryArray = [];
    
    // build the categories and categoryArray 
    $.each(myList,function(_,e){
        var cat = getCategory(e);
        if (categories[cat] === undefined)
        {
            categories[cat] = [];
            categoryArray.push(cat);
        }
        if (categories[cat].indexOf(e) < 0)
            categories[cat].push(e);
    });
    
    // build our selector as array of groups
    var selectors = buildSelector(categories, categoryArray, 0);
    
    // join all selector groups to get the string form
    console.log(selectors.join(","));