Как проанализировать и преобразовать объект в другой объект с другой структурой «ключ / значение» - PullRequest
0 голосов
/ 02 апреля 2019

Я использую «jQuery Query Builder» (в пользовательском интерфейсе) для создания пользовательского объекта на основе пользовательских данных, и мне нужно передать этот объект в качестве входных данных «json-rules-engine» (в сервере) для генерацииРезультат основан на условиях в объекте.Но проблема в том, что Query Builder выдает выходные данные в другом формате, а обработчик правил принимает их в другом формате.

Я могу перебрать все узлы объекта и получить «ключи / значения»соответственно.Но я не могу использовать эти «значения» для создания нового объекта с другой структурой.

var object = {
  "condition": "OR",
  "rules": [{
      "condition": "AND",
      "rules": [{
          "field": "name",
          "operator": "equal",
          "value": "romeo"
        },
        {
          "field": "category",
          "operator": "not_equal",
          "value": "books"
        }
      ]
    },
    {
      "condition": "AND",
      "rules": [{
          "field": "price",
          "operator": "greater_or_equal",
          "value": 100
        },
        {
          "field": "in_stock",
          "operator": "equal",
          "value": 1
        }
      ]
    }
  ]
};

function printObj(obj) {
  for (var key in obj) {
    var value = obj[key];
    if (typeof value === 'object') {
      printObj(value);
    } else {
      console.log(value);
    }
  }
}
printObj(object);

В настоящее время я могу перебирать все узлы и читать все «ключ / значение».Но мне нужно превратить этот объект в нечто вроде следующего:

Ожидаемый результат:

{
  any: [{
    all: [{
      fact: 'name',
      operator: 'equal',
      value: "romeo"
    }, {
      fact: 'category',
      operator: 'not_equal',
      value: "books"
    }]
  }, {
    all: [{
      fact: 'price',
      operator: 'greater_or_equal',
      value: 100
    }, {
      fact: 'in_stock',
      operator: 'equal',
      value: 1
    }]
  }]
}

1 Ответ

0 голосов
/ 02 апреля 2019

У меня был быстрый удар в этом.Смотрите мой рабочий пример: https://jsfiddle.net/30m1z25r/

Вы были на правильном пути с вашей функцией рекурсии printObj.

Созданная мною функция:

/**
 * Format a jQuery Query Builder object for json-rules-engine
 *
 * @param       {Object}    query       Pass the query builder object
 * @return  {Object}                    Formatted object
 */
function formatQuery(query) {
    var condition   = (query.condition || '').toLowerCase();
    var rules           = query.rules || [];
    var type            = condition === 'and' ? 'all' : 'any';

    if (condition) {
        // Create an empty object for appending values
        var build = {};

        // Create empty array for storing formatted children
        build[type] = [];

        // Loop through rules and append formatted objects
        for (var i = 0; i < rules.length; i++) {
            var rule = rules[i];
            build[type].push( formatQuery(rule) );
        }

        // Return fully formatted object
        return build;
    }

    // If no condition, return self
    return query;
}

*Это не полностью протестировано, поэтому вам, возможно, придется внести некоторые изменения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...