сгенерировать новый набор шаблонов массива из l oop в javascript - PullRequest
0 голосов
/ 19 июня 2020

Привет, у меня есть один тип данных объекта, из которого мне нужно сгенерировать новые шаблоны массива для фильтрации операции, но каким-то образом я не смог достичь ожидаемого выходного шаблона из приведенного ниже кода, не где мне не хватает logi c

sample code
filterArray = {floor:["floor1","floor2","floor3"],age:[26,23,24],dept:["IT"]}
 var filter = [];
 var groupArray = [];
 for(var key in filterArray){
   var keys = filterArray[key];
   for (value in keys){
    if (keys.length > 1){
      groupArray.push([key, "=",keys[value]]);
      groupArray.push("or");

    }else{
      if (filter.length > 0){
        filter.pop()
        filter.push("and")
        filter.push([key, "=",keys[value]]);
        filter.push("and");  
      }else{
        filter.push([key, "=",keys[value]]);
        filter.push("and");  
      }

    }
}
}
filter.pop()
groupArray.pop()
if (groupArray.length > 0){
filter.push(groupArray);
}

мой пример Результат

[
 [
    ["floor", "=", "floor1"],
    "or",
    ["floor", "=", "floor2"],
    "or",
    ["floor", "=", "floor3"],
    "or",
    ["age", "=", "26"],
    "or",
    ["age", "=", "23"],
    "or",
    ["age", "=", "24"]
],
"and",
[ "dept", "=", "IT"]
]

но мой ожидаемый результат

[
[
    ["floor", "=", "floor1"],
    "or",
    ["floor", "=", "floor2"],
    "or",
    ["floor", "=", "floor3"]
],
"and",
 [
    ["age", "=", "26"],
    "or",
    ["age", "=", "23"],
    "or",
    ["age", "=", "24"]
],
"and",
 [ "dept", "=", "IT"]
]

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

(Примечание: этот массив фильтров генерируется динамически на основе ввода данных пользователем)

1 Ответ

3 голосов
/ 19 июня 2020

Один из способов сделать это - map ключи, а затем значения объекта для создания вложенных массивов условий, а затем использовать splice для вставки or или and по мере необходимости:

let filterArray = {
  floor: ["floor1", "floor2", "floor3"],
  age: [26, 23, 24],
  dept: ["IT"]
}
let filter = Object.keys(filterArray).map(key => {
  let ors = filterArray[key].map(v => [key, '=', v]);
  let len = ors.length;
  for (let i = 1; i < len; i++) {
    ors.splice(2 * i - 1, 0, 'or');
  }
  return ors;
});
let len = filter.length;
for (let i = 1; i < len; i++) {
  filter.splice(2 * i - 1, 0, 'and');
}
console.log(filter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...