0

我需要将过滤器应用于项目集合中的 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 的函数。任何帮助将不胜感激。

4

1 回答 1

1

我有一个想法如下:

  1. 建立一个哈希表,键是类别,值是包含在数组中的子类别myList数组。
  2. 递归遍历构建的数组并构建所有可用的组合。

这是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(","));
于 2013-08-04T07:53:18.940 回答