Я расширяю приложение изотопов - и сейчас я пытаюсь объединить значения мультифильтра с приложением.
Я заметил 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);
}