如何映射嵌套的对象数组?

时间:2019-12-11 01:55:32

标签: javascript node.js logic

我有一个用例,我需要查询NoSql表( AWS DynamoDb ),
会给我一个清单,
每个结果还需要在同一张表上进行查询。

我的表格有2个重要列-
1. sub_service_id
2. parent_id

查询是在表的 parent_id 列上进行的
每条记录只有1个parent_id,
但是parent_id可以出现在多行中,因此1个父级可以有多个子级。

我的表格如下所示- enter image description here

除了第一个通话, parent_id 字段中的所有其余通话,
使用每条记录的 sub_service_id 完成。

如您在图像中所见,
第一个记录是第二个记录的父记录,
第二条记录是第三条记录的父项。

但是从理论上讲,第一,第二和第三条记录可以分别具有多个子记录。
可以使用主键(sub_service_id)或索引(parent_id)查询NoSql表(AWS DynamoDb)

我尝试了以下代码,但无法弄清逻辑-

var tree = {};
var requestBody = "";
module.exports.listServiceRelation = async (constants, requestBody) => {

    let requestContext = requestBody.context;
    requestBody = requestBody.request;

    let connection = await dynamoDb.getDynamoConnection(constants);
    console.log('db connection created!');

    let apiResponse = await getSubServiceHierarchy(constants, connection, requestBody.service_id);

};

let getSubServiceHierarchy = async (constants, connection, parent_id) => {

    let subServices = await dynamoDb.getSubServiceByParentId(constants, connection, parent_id);

    if(subServices != undefined && subServices.Items != undefined && subServices.Items.length > 0){

        let subServicesArr = [];
        for(let i in subServices.Items){
            let temp = {};

            let currObj = subServices.Items[i];

            temp.sub_service_id = currObj.sub_service_id;
            temp.sub_service_name = currObj.sub_service_name;
            temp.parent_id = currObj.parent_id;

            subServicesArr.push(temp);
        }
        tree[parent_id] = subServicesArr;

        for(let i in subServices.Items){
            let currObj = subServices.Items[i];

            let grandChildren = await dynamoDb.getSubServiceByParentId(constants, connection, currObj.sub_service_id);

            if(grandChildren != undefined && grandChildren.Items != undefined && grandChildren.Items.length > 0){
                getSubServiceHierarchy(constants, connection, grandChildren);
            }
        }
    }
    else{
        return [];
    }
};

对于我的用例,我需要伪代码逻辑的帮助,
我的输出必须是这样-

[
    {
        "sub_service_id": "1",
        "parent_id": "main_service_id",
        "children": [{
            "sub_service_id": "2",
            "parent_id": "1",
            "children": [{
                "sub_service_id": "3",
                "parent_id": "2",
                "children": []
            }]
        }]
    },
    {
        "sub_service_id": "4",
        "parent_id": "main_service_id",
        "children": []
    }
]

0 个答案:

没有答案