遍历无限嵌套的对象和构造字符串

时间:2019-02-08 10:47:34

标签: javascript loops object recursion

我在一个项目中使用this query component,以便用户可以构造查询。

我很难将其解析为实际的示例查询,例如对于组件输出的该对象的查询:

const queryParams = {
  "rules": [
    {
      "rules": [
        {
          "field": "firstName",
          "value": "John",
          "operator": "="
        },
        {
          "field": "lastName",
          "value": "Doe",
          "operator": "="
        }
      ],
      "combinator": "and"
    },
    {
      "rules": [
        {
          "field": "age",
          "value": "20",
          "operator": "="
        },
        {
          "field": "address",
          "value": "London",
          "operator": "="
        }
      ],
      "combinator": "and"
    }
  ],
  "combinator": "and"
}

我需要创建一个函数,以输出更加用户友好的可读输出,例如:

((FirstName = John AND LastName = Doe) AND (AGE = 20 AND Address = London))

我已经试过了,但是我发现的困难是:

  • 该对象理论上可以无限嵌套,我不知道它是如何嵌套的。是使用递归做到这一点的唯一方法吗?还是有更简单的方法

  • 规则和组可以在同一对象中

我当前尝试的方式无法动态运行,因此,我们将不胜感激任何帮助或指导。

谢谢

1 个答案:

答案 0 :(得分:3)

您可以采用递归方法并建立规则集或最终比较。

它通过检查rules属性来起作用:

  • 如果给定,则rules与函数的递归调用映射。

    此调用的结果与一个大写的combinator属性结合在一起,并用括号括在一个需要的空格中。

  • 否则,请使用具有fieldoperatorvalue属性的新字符串。

function combine(object) {
    return 'rules' in object
        ? `(${object.rules.map(combine).join(` ${object.combinator.toUpperCase()} `)})`
        : `${object.field} ${object.operator} ${object.value}`;
}

var data = { rules: [{ rules: [{ field: "firstName", value: "John", operator: "=" }, { field: "lastName", value: "Doe", operator: "=" }], combinator: "and" }, { rules: [{ field: "age", value: "20", operator: "=" }, { field: "address", value: "London", operator: "=" }], combinator: "and" }], combinator: "and" },
    result = combine(data);

console.log(result);