循环通过JSON子对象

时间:2015-07-08 16:38:03

标签: javascript arrays json foreach

所以我循环遍历中间复杂的json对象并在到达递归循环结束时保存所有值

对象,例如

"if": {
    "and": {
        "or": {
            "compare": [
                {
                    "Hello": {
                        "constant": {
                            "string": "1"
                        }
                    },
                },
                {
                    "Hello": {
                        "constant": {
                            "string": "4"
                        }
                    }
                }
            ]
        },
        "before": {
            "Hello2": "12131",
            "Hello": {
                "constant": {
                    "datetime": "2001-01-01T00:00:00"
                }
            }
        }
    }
}

然后我有我的功能:

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”时,它将创建新对象并用新数据填充它。

所以我坚持不断引用父对象。我想要维护的密钥很少,例如“和”& “要么”。因此我有第一个循环结束停止在字符串:1我想保持它是“或”的一部分。同样,我想保持“或”是“和”的一部分。最后,日期时间是“和”的一部分。请记住,我可以在彼此之间有多个“和”和“或”。

编辑:

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

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

                }
            }

        }
}

期望的结果:

[
    [
        {
            "child": "and"
        }
    ],
    [
        {
            "parent": "and"
        },
        {
            "child": "or"
        }
    ],
    [
        {
            "parent": "or"
        },
        {
            "string": "1"
        }
    ],
    [
        {
            "parent": "or"
        },
        {
            "string": "4"
        }
    ],
    [
        {
            "parent": "and"
        },
        {
            "datetime": "2001-01-01T00:00:00"
        }
    ]
]

1 个答案:

答案 0 :(得分:1)

在这里,你在process()函数中处理你的键和值:

44(01,02,03,04,05,06,07,08)
46
47.10

希望这有帮助。

相关问题