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"

各アイテムは、各カテゴリの 1 つのサブカテゴリにのみ属することができます。

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 に答える