【问题标题】:How to 'Parse and Transform an Object into another Object with different "key/value" structure'如何“将一个对象解析并转换为具有不同“键/值”结构的另一个对象'
【发布时间】:2019-08-23 12:00:22
【问题描述】:

我正在使用“jQuery Query Builder”(在 UI 中)根据用户输入生成自定义对象,我需要将此对象作为“json-rules-engine”(在服务器中)的输入来生成a 基于对象条件的结果。但问题是查询生成器以不同格式提供输出,而规则引擎以其他格式接收输入。

我能够遍历对象的所有节点并分别获取“键/值”。但我无法使用这些“值”来生成具有不同结构的新对象。

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
    }]
  }]
}

【问题讨论】:

    标签: javascript jquery arrays object recursion


    【解决方案1】:

    我对此进行了快速尝试。请参阅我的工作示例: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;
    }
    

    *这还没有完全测试,所以你可能需要做一些调整

    【讨论】:

    • 是的。它工作正常。感谢您让它变得简单干净。
    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2015-01-17
    • 2022-06-10
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2021-08-14
    • 2016-05-04
    相关资源
    最近更新 更多