Многоизотопная фильтрация с помощью ramda - PullRequest
0 голосов
/ 19 февраля 2020

Я расширяю приложение изотопов - и сейчас я пытаюсь объединить значения мультифильтра с приложением.

Я заметил 2 проблемы.

1-й - когда я устанавливаю фильтр - он обновляет состояние - но он почти как мое дерево состояний позади - кажется, он не зарегистрировал setState непосредственно после того, как я посмотрел на состояние. Таким образом, фильтрация не является точной.

2nd - фактическая комбинация нескольких фильтров. Так что я знаю, что у меня может быть 2 фильтра - и у каждого может быть набор значений

let availableFilters = ['statuspromo', 'regionspromo'];
//statuspromo
//regionspromo
let comboValues = [];
availableFilters.map(filter => {
    if(this.state['filteredOption_'+filter]){
        comboValues.push(this.state['filteredOption_'+filter]);
    }
});

, это дает мне массив comboValues ​​- который содержит 2 фильтра - но теперь мне нужно объединить их.

на этом уровне comboValues ​​- выглядит как [['LIVE', 'IN_PROGRESS'], ['SIEE']]

Сначала я использовал ramda для выравнивания массива - flatten (comboValues) - но это даст мне ситуацию ИЛИ.

Мне нужно объединить два набора массивов или более ---- чтобы что-то вроде "opts = '.LIVE.SIEE, .IN_PROGRESS.SIEE'" - pu sh это в фильтр изотопов (опций) так, чтобы 2 фильтра были в режиме AND

, что является лучшим способом сделать это. Хочу сделать это чисто - даже при том способе, которым я отображаю комбинированные значения старым методом, я добавляю вариант класса и объединение, чтобы получить

let opts = comboValues.map(val => '.' + val).join(',');
let options = { filter: opts };
this.state.iso.arrange(options);

        let layer1 = [];
        let layer2 = [];

        let merged = [];

        if(comboValues[0]){
            layer1 = comboValues[0].map(val => '.' + val);//.join(',');
        }
        if(comboValues[1]){
            layer2 = comboValues[1].map(val => '.' + val);//.join(',');

            layer1.map(val1 => {
                layer2.map(val2 => {
                    merged.push(val1+''+val2);
                });
            });
        }

//let layer1 = [".EXPIRED", ".SONY_FINALIZING"]
//let layer2 = [".SIEJA-ASIA"]
//let merged = [".EXPIRED.SIEJA-ASIA", ".SONY_FINALIZING.SIEJA-ASIA"]

        console.log("layer1", layer1);
        console.log("layer2", layer2);

        console.log("merged", merged);

        let opts = merged.join(',');
        console.log("opts", opts);
        let options = { filter: opts };
        this.state.iso.arrange(options);

окончательный текущий код

multiFilterIsotope = () => {
    console.log("this.state!!!!!!!!!!!", this.state);

    let availableFilters = ['statuspromo', 'regionspromo'];
    //statuspromo
    //regionspromo
    let comboValues = [];
    availableFilters.map(filter => {
        if(this.state['filteredOption_'+filter]){
            comboValues.push(this.state['filteredOption_'+filter]);
        }
    });

    //comboValues = flatten(comboValues);
    //console.log("comboValues", comboValues);

    let layer1 = [];
    let layer2 = [];

    let merged = [];

    if(comboValues[0] && comboValues[0].length > 0){
        layer1 = comboValues[0].map(val => '.' + val);//.join(',');

        //merged = layer1;
    }
    if(comboValues[1] && comboValues[1].length > 0){
        layer2 = comboValues[1].map(val => '.' + val);//.join(',');

        layer1.map(val1 => {
            layer2.map(val2 => {
                merged.push(val1+''+val2);
            });
        });
    } else {
        merged = layer1;
    }

    console.log("layer1", layer1);
    console.log("layer2", layer2);

    console.log("merged", merged);

    let opts = merged.join(',');
    console.log("opts", opts);
    let options = { filter: opts };
    this.state.iso.arrange(options);


    //comboValues = ["SONY_FINALIZING.SIEJA-ASIA", "EXPIRED.SIEJA-ASIA"];


    //let opts = comboValues.map(val => '.' + val).join(',');
    //let options = { filter: opts };
    //this.state.iso.arrange(options);
}

1 Ответ

0 голосов
/ 19 февраля 2020

Я придумал это - но будет ли это работать с большим количеством опций фильтров - например, 3 фильтра?

    function mash(layer, m){
        let merge = [];

        console.log("layer", layer);

        m.map(val1 => {
            layer.map(val2 => {
                merge.push(val1 + '' + val2);
            });
        });
        if(m.length === 0){
            merge = layer;
        }
        return merge;
    }


    let merged = [];
    comboValues.map(layer => {
        let l = layer.map(val => '.' + val);
        //console.log('l', l);
        if(l.length > 0) {
            merged = mash(l, merged);
        }
    });
...