首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环遍历JSON子对象

循环遍历JSON子对象
EN

Stack Overflow用户
提问于 2015-07-09 00:38:03
回答 1查看 2.8K关注 0票数 2

因此,当我到达递归循环的末尾时,我将遍历中间复杂的json对象并保存所有的值。

对象,例如

代码语言:javascript
运行
复制
"if": {
    "and": {
        "or": {
            "compare": [
                {
                    "Hello": {
                        "constant": {
                            "string": "1"
                        }
                    },
                },
                {
                    "Hello": {
                        "constant": {
                            "string": "4"
                        }
                    }
                }
            ]
        },
        "before": {
            "Hello2": "12131",
            "Hello": {
                "constant": {
                    "datetime": "2001-01-01T00:00:00"
                }
            }
        }
    }
}

然后我有了我的函数:

代码语言:javascript
运行
复制
function getAllGroups(obj)
{

        for (var k in obj)
        {
            if (k === "hello") {
                counter++;
                array.push([]);
            }
            if (typeof obj[k] == "object" && obj[k] !== null) {
                getAllGroups(obj[k]);
            }
            else
            {
                if (k !== "hello2") {
                    array[array.length - 1].push(obj[k]);
                }
            }

        }
}

现在可能没有任何意义,但基本上是:

当它找到键"hello“时,我将新对象添加到我的空数组中,并用数据填充该对象。每当它到达键"hello“时,它将创建新对象并用新数据填充它。

因此,我被困在保持对父对象的引用上。我想要维护的键很少,例如"and“& "or”。因此,我有一个循环的第一个结束点,这个结束点是string: 1,我想保持它是"or“的一部分。同样,我想保留"or“是"and”的一部分。最后,datetime是"and“一部分。请记住,我可以在彼此之间使用多个" and“和"or”。

编辑:

我已更改为代码,因此它将保留对父对象的引用。不幸的是,它将保持对列表中最后一个父级的引用,因此"datetime“是"and”的子级,但我的代码显示了它的子级"or“

代码语言:javascript
运行
复制
function getAllGroups(obj)
{

        for (var k in obj)
        {
            if (k === "and" || k === "or" || k === "not")
            {
                if (parentKey !== "") {
                    array.push([]);
                    array[array.length - 1].push(array[array.length - 1]['parent'] = parentKey);
                    parentKey = k + parentKeyNo;
                    parentKeyNo++;
                    array[array.length - 1].push(array[array.length - 1]['child'] = parentKey);
                }
                else {
                    parentKey = k + parentKeyNo;
                    parentKeyNo++;
                    array.push([]);
                    array[array.length - 1].push(array[array.length - 1]['child'] = parentKey);
                }
            }
            if (k === "Hello") {
                counter++;
                array.push([]);
            }
            if (typeof obj[k] == "object" && obj[k] !== null) {
                getAllGroups(obj[k]);
            }
            else
            {
                if (k !== "Hello2") {
                    if (array[array.length - 1].hasOwnProperty('parent'))
                    {
                        array[array.length - 1].push(obj[k]);
                    }
                    else
                    {
                        array[array.length - 1].push(array[array.length - 1]['parent'] = parentKey);
                        array[array.length - 1].push(obj[k]);
                    }

                }
            }

        }
}

期望的结果:

代码语言:javascript
运行
复制
[
    [
        {
            "child": "and"
        }
    ],
    [
        {
            "parent": "and"
        },
        {
            "child": "or"
        }
    ],
    [
        {
            "parent": "or"
        },
        {
            "string": "1"
        }
    ],
    [
        {
            "parent": "or"
        },
        {
            "string": "4"
        }
    ],
    [
        {
            "parent": "and"
        },
        {
            "datetime": "2001-01-01T00:00:00"
        }
    ]
]
EN

回答 1

Stack Overflow用户

发布于 2015-07-09 01:25:15

在这里,您可以在process()函数中处理键和值:

代码语言:javascript
运行
复制
var json = {
  "if": {
    "and": {
      "or": {
        "compare": [{
          "Hello": {
            "constant": {
              "string": "1"
            }
          },
        }, {
          "Hello": {
            "constant": {
              "string": "4"
            }
          }
        }]
      },
      "before": {
        "Hello": {
          "constant": {
            "datetime": "2001-01-01T00:00:00"
          }
        }
      }
    }
  }
};

//called with every property and it's value
var helloValues = [];

function process(key, value) {
  console.log(key + " : " + value);
  if (key == 'Hello') helloValues.push(value);
}

function traverse(o, func) {
  for (var i in o) {
    func.apply(this, [i, o[i]]);
    if (o[i] !== null && typeof(o[i]) == "object") {
      //going on step down in the object tree!!
      traverse(o[i], func);
    }
  }
}

//that's all... no magic, no bloated framework
traverse(json, process);
alert(helloValues.length);

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31298651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档