繁体   English   中英

如何'将对象解析并转换为具有不同“键/值”结构的另一个对象

[英]How to 'Parse and Transform an Object into another Object with different “key/value” structure'

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

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

 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); 

目前,我可以遍历所有节点并读取所有“键/值”。 但我需要将此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
    }]
  }]
}

我快速刺了这个。 看我的工作示例: 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;
}

*这未经过全面测试,因此您可能需要进行一些调整

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM