Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环通过无限嵌套对象&;构造字符串_Javascript_Loops_Object_Recursion - Fatal编程技术网

Javascript 循环通过无限嵌套对象&;构造字符串

Javascript 循环通过无限嵌套对象&;构造字符串,javascript,loops,object,recursion,Javascript,Loops,Object,Recursion,我正在我的一个项目中使用,以便用户可以构造查询 我很难将其解析为实际的示例查询,例如组件输出的这个对象: const queryParams = { "rules": [ { "rules": [ { "field": "firstName", "value": "John", "operator": "=" }, { "field": "las

我正在我的一个项目中使用,以便用户可以构造查询

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

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))
我已经试过了,但我发现困难在于:


  • 理论上,这个对象可以无限嵌套,我从来不知道它是如何嵌套的。递归是实现这一点的唯一方法吗?还是有更简单的方法

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

我目前尝试的方式不会动态工作,因此任何帮助或指导都将不胜感激


多亏了您可以采用递归方法构建规则集或最终比较

它通过检查
规则
属性来工作:

  • 如果给定,
    规则
    将通过递归调用函数进行映射

    此调用的结果与一个大写的
    combinator
    属性连接在一起,并包装成一个带括号的空格字符串

  • 如果没有,则使用
    字段
    运算符
    属性获取一个新字符串

函数组合(对象){
返回对象中的“规则”
?`(${object.rules.map(combine.join)(`${object.combinator.toUpperCase()}`)})`
:`${object.field}${object.operator}${object.value}`;
}
var数据={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”},
结果=合并(数据);

控制台日志(结果)你们能分享一下你们目前是怎么做的吗?“对象理论上可以无限嵌套”-使用for循环应该可以解决这个问题,你们尝试过递归吗?共享您的代码如果您决定这样做,您可以始终使用循环和堆栈(LIFO)结构来模拟递归。这个(非JS)解释非常简单:。。。(虽然如果你想了解那些古怪的递归,这似乎是一个很棒的JS教程:)这是一个非常好的方法,但最好有一个解释这实际上是一个转储组件,它缺少字段类型:),因此我们可以确定字段是否为string,intetc@Alen.Toma,我认为这只是以一种简化的方式向用户展示正在发生的事情。正确@NinaScholz-感谢您提供的解决方案,这很好