【问题标题】:Loop through infinitely nested object & Construct string循环无限嵌套对象并构造字符串
【发布时间】:2019-07-02 14:21:09
【问题描述】:

我在我的一个项目中使用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))

我已经尝试过了,但我发现的困难在于:

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

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

我目前尝试的方式不会动态工作,因此非常感谢任何帮助或指导。

谢谢

【问题讨论】:

  • 您能分享一下您目前的尝试吗?
  • "对象理论上可以无限嵌套" - 使用 for 循环应该可以解决这个问题,您是否尝试过任何递归?分享您的代码
  • 如果您决定采用这种方式,您始终可以使用循环和堆栈 (LIFO) 结构来模拟递归。这个(非 JS)解释非常简单:refactoring.com/catalog/replaceRecursionWithIteration.html ...(尽管如果你想学习那些古怪的递归,这似乎是一个很棒的 JS 教程:javascript.info/recursion

标签: javascript loops object recursion


【解决方案1】:

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

它通过检查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);

【讨论】:

  • 非常好的方法,但最好有解释。 ;)
  • 这确实是一个转储组件,它缺少字段类型:) 所以我们可以识别该字段是字符串、int 等
  • @Alen.Toma,我认为这只是以简化的方式向用户展示正在发生的事情。
  • 正确@NinaScholz - 谢谢你的解决方案,这很棒
猜你喜欢
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多