javascript - 在javascript中将平面数组转换为json

标签 javascript json parsing hierarchical-data

我有两个实体之间的一系列对话,每个实体都根据父级和级别进行区分。每个请求后面都会跟着一个响应对象。示例输入结构如下所示

[
{ "message": "one", "messageSequence": 0, "level": 1, "Parent": "", "messageType": "request" },
{ "message": "two", "messageType": "response", "messageSequence": 1 },
{ "message": "three-1 (3.1)", "messageSequence": 2, "level": 2, "Parent": 1, "messageType": "request" },
{ "message": "four", "messageType": "response", "messageSequence": 3 },
{ "message": "five-1 (5.1)", "messageSequence": 4, "level": 3, "Parent": 2, "messageType": "request" },
{ "message": "six", "messageType": "response", "messageSequence": 5 },
{ "message": "five-2 (5.2)", "messageSequence": 6, "level": 3, "Parent": 2, "messageType": "request" },
{ "message": "seven", "messageType": "response", "messageSequence": 7 },
{ "message": "three-2 (3.2)", "messageSequence": 8, "level": 2, "Parent": 1, "messageType": "request" },
{ "message": "eight", "messageType": "response", "messageSequence": 9 },
{ "message": "nine-1 (9.1)", "messageSequence": 10, "level": 3, "Parent": 2, "messageType": "request" },
{ "message": "ten", "messageType": "response", "messageSequence": 11 },
{ "message": "nine-2 (9.2) ", "messageSequence": 12, "level": 3, "Parent": 2, "messageType": "request" },
{ "message": "eleven", "messageType": "response", "messageSequence": 13 }
]

我正在尝试根据请求及其相应的响应生成一个 json。下面是我用来实现它的方法

var prevLevel;
var lastUserItem = 0;
function convertToJson(array) {
    var map = {};
    for (var i = 0; i < array.length; i++) {
        var obj = array[i];
        if (array[i].messageType == "request")
            obj.request = [];
        else
            obj.response = {};

        if (obj.level) {
            prevLevel = obj.level
            map[obj.level] = obj;

            var parent = obj.Parent || '-';
            if (!map[parent]) {
                map[parent] = {
                    request: []
                };
            }
            delete obj.Parent;
            delete obj.level;
            delete obj.messageType;
            delete obj.messageSequence;
            map[parent].request.push(obj);
            lastUserItem = map[parent].request.length - 1;
        } else {
            delete obj.Parent;
            delete obj.level;
            delete obj.messageType;
            delete obj.messageSequence;
            if (map[prevLevel].request && map[prevLevel].request.length > 0) {
                map[prevLevel].request[lastUserItem].response = {};
                map[prevLevel].request[lastUserItem].response = obj;
            } else {

                map[prevLevel].response = {};
                map[prevLevel].response = obj;
            }
        }
    }

    return map['-'].request;

}
var r = convertToJson(messages);
console.log(JSON.stringify(r));

我得到的响应不是基于请求实体构建的。 上述方法的响应

[
{
    "message": "one",
    "request": [
    {
        "message": "three-1 (3.1)",
        "request": [
        {
            "message": "five-1 (5.1)",
            "request": [],
            "response":
            {
                "message": "six",
                "response":
                {}
            }
        },
        {
            "message": "five-2 (5.2)",
            "request": [],
            "response":
            {
                "message": "seven",
                "response":
                {}
            }
        }],
        "response":
        {
            "message": "four",
            "response":
            {}
        }
    },
    {
        "message": "three-2 (3.2)",
        "request": [
        {
            "message": "nine-1 (9.1)",
            "request": [],
            "response":
            {
                "message": "ten",
                "response":
                {}
            }
        },
        {
            "message": "nine-2 (9.2) ",
            "request": [],
            "response":
            {
                "message": "eleven",
                "response":
                {}
            }
        }],
        "response":
        {
            "message": "eight",
            "response":
            {}
        }
    }],
    "response":
    {
        "message": "two",
        "response":
        {}
    }
}]

Response 对象正在分离。预期的 json 输出如下所示

{
    "request": [{
        "message": "one",
        "response": {
            "message": "two"
            "request": [{
                    "message": "three-1 (3.1)",
                    "response": {
                        "message": "four"
                        "request": [{
                                "message": "five-1 (5.1)",
                                "response": {
                                    "message": "six"
                                }
                            },
                            {
                                "message": "five-2 (5.2)",
                                "response": {
                                    "message": "seven"
                                }
                            }
                        ]
                    }
                },
                {
                    "message": "three-2 (3.2)",
                    "response": {
                        "message": "eight",
                        "request": [{
                                "message": "nine-1 (9.1)",
                                "response": {
                                    "message": "ten"
                                }
                            },
                            {
                                "message": "nine-2 (9.2) ",
                                "response": {
                                    "message": "eleven"
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }]
}

请指出我哪里出错了。在输入结构中进行任何更改以获得所需的输出。

https://jsfiddle.net/49qLhL8g/4/

最佳答案

如果 'response' 类型总是紧跟在 'request' 之后,那么您可以构建一个新对象并向前看下一个对象并将其插入作为结果将消息发送到新对象中。

该提案使用一个数组作为级别引用,并更新该数组和结果中的级别。

var data = [{ message: "one", messageSequence: 0, level: 1, Parent: "", messageType: "request" }, { message: "two", messageType: "response", messageSequence: 1 }, { message: "three-1 (3.1)", messageSequence: 2, level: 2, Parent: 1, messageType: "request" }, { message: "four", messageType: "response", messageSequence: 3 }, { message: "five-1 (5.1)", messageSequence: 4, level: 3, Parent: 2, messageType: "request" }, { message: "six", messageType: "response", messageSequence: 5 }, { message: "five-2 (5.2)", messageSequence: 6, level: 3, Parent: 2, messageType: "request" }, { message: "seven", messageType: "response", messageSequence: 7 }, { message: "three-2 (3.2)", messageSequence: 8, level: 2, Parent: 1, messageType: "request" }, { message: "eight", messageType: "response", messageSequence: 9 }, { message: "nine-1 (9.1)", messageSequence: 10, level: 3, Parent: 2, messageType: "request" }, { message: "ten", messageType: "response", messageSequence: 11 }, { message: "nine-2 (9.2) ", messageSequence: 12, level: 3, Parent: 2, messageType: "request" }, { message: "eleven", messageType: "response", messageSequence: 13 }],
    result = [],
    levels = [result];

data.forEach(function (o, i, a) {
    var level = o.level - 1, temp;
    if (o.messageType !== 'request') {
        return;
    }
    temp = { message: o.message, response: { message: a[i + 1].message, request: [] } };
    levels[level + 1] = temp.response.request;
    levels[level].push(temp);
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 在javascript中将平面数组转换为json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49232720/

相关文章:

javascript - JQuery 克隆 li+children,更新文本(在子标签中),并追加

javascript - JSON 数据到 Javascript 数组未定义

java - 将文本文件树形结构内容转换为关系平面数据集

c# - 从字符串中提取值

java - 在 java 中从 HTML 中删除 css 信息

javascript - 用户使用浏览器的后退或刷新功能时 SPA 中的问题

javascript - 使用 jquery 修改自定义 HTML-Attribute 不会影响 CSS

javascript - 如何更改 Smoke.js 中烟雾的颜色?

objective-c - 使用 RestKit 将 bool 属性从 JSON 映射到 NSManagedObject

json - Perl 解析 JSON 代码 - 为什么我的路径错误?