Кодовый логический массив javascript

#javascript #arrays #logic

#javascript #массивы #Логические

Вопрос:

Я использую плагин jQuery isotope для сортировки и фильтрации элементов. Элементы — это продукты, имеющие несколько групп фильтров. Я сталкиваюсь с одной проблемой, мне нужно фильтровать продукты с помощью атрибута фильтра с несколькими выборками в примере одной группы:

Группы фильтров: пол, категория продукта, материал продукта.

Выберите образец: мужчины, сумка, кожа.

Приведенный выше пример работает нормально.

Но мне нужно что-то вроде

Новый выбор фильтра: Мужчины, Сумка, Кошелек, кожа, Rexin.

Если вы заметили, что сумка и кошелек из одной группы. И leather, и Rexin из одной группы.

для этого мне нужно было бы передать значение фильтра следующим образом

значение фильтра — .men.bag.leather,.men.wallet.leather,.men.bag.rexin,.men.wallet.rexin.

Это звучит просто, но мне сложно это кодировать.

У меня есть массив каждой группы фильтров, который я обновляю, когда пользователь выбирает или отменяет выбор определенного фильтра

Итак, по сути, мне нужно объединить или сгруппировать несколько массивов фильтров в одну строку, при этом каждая группа содержит каждый элемент из каждого массива, и каждая группа разделяется запятой.

Массивы в javascript:

 var gender = ['.men'];
var type = ['.bag','.wallet'];
var material = ['.leather','.rexin'];
Output:
".men.bag.leather,.men.wallet.leather,.men.bag.rexin,.men.wallet.rexin"
  

Надеюсь, мне ясно, что мне нужно.

Помощь очень ценится.

Обновить:

Поскольку фильтры могут различаться для разных продуктов, я не могу использовать жестко заданные переменные, такие как пол, тип и т.д. Поэтому вместо этого я использую массив фильтров

 var selectedFilter = [];
selectedFilter['gender'] = ['.men'];
selectedFilter['type'] = ['.bag','.wallet'];
selectedFilter['platform'] = ['.leather','.rexin'];
  

Нужен вывод типа:
«.men.bag.leather,.men.wallet.leather,.men.bag.rexin,.men.wallet.rexin».

Нужна какая-то функция, которую я могу напрямую передать одной переменной массива. Нравится

 combine(selectedFilter);
  

Ответ №1:

Вы могли бы использовать комбинированный алгоритм.

 function combine(object) {
    function c(part, index) {
        array[index].forEach(function (a) {
            var p = part.concat([a]);
            if (p.length === array.length) {
                r.push(p.join(''));
                return;
            }
            c(p, index   1);
        });
    }

    var array = Object.keys(object).map(function (k) { return object[k]; }),
        r = [];

    c([], 0);
    return r.join();
}

var selectedFilter = {                         // use an object instead of 
        gender: ['.men'],                      // an array with properties
        type: ['.bag','.wallet'],
        platform: ['.leather','.rexin']
    };

console.log(combine(selectedFilter));