如何推翻数组结果树从子-父到父-子在Javascript

How to overturned array result tree from child-parent to parent-child in Javascript

本文关键字:子在 Javascript 何推翻 数组 结果      更新时间:2023-09-26

谁能帮我用javascript函数来推翻下面这个数组。这是我从数据库中得到的结果,并打算使用javascript做一些树。

[{
    SubCategoryId: 1,
    SubCategoryName: "SubCategoryName1",
    Category: {
        CategoryId: 11,
        CategoryName: "CategoryName1",
        MainCategory: {
            MainCategoryId: 111,
            MainCategoryName: "MainCategoryName1",
        }
    }
},{
    SubCategoryId: 2,
    SubCategoryName: "SubCategoryName2",
    Category: {
        CategoryId: 11,
        CategoryName: "CategoryName1",
        MainCategory: {
            MainCategoryId: 111,
            MainCategoryName: "MainCategoryName1",
        }
    }
},{
    SubCategoryId: 3,
    SubCategoryName: "SubCategoryName3",
    Category: {
        CategoryId: 22,
        CategoryName: "CategoryName2",
        MainCategory: {
            MainCategoryId: 111,
            MainCategoryName: "MainCategoryName1",
        }
    }
}]

我期望的结果是:

[{
    MainCategoryId: 111,
    MainCategoryName: "MainCategoryName1",
    Category: [{
        CategoryId: 11,
        CategoryName: "CategoryName1",
        SubCategory: [{
            SubCategoryId: 1,
            SubCategoryName: "SubCategoryName1",
        }, {
            SubCategoryId: 2,
            SubCategoryName: "SubCategoryName2",
        }]
    }, {
        CategoryId: 22,
        CategoryName: "CategoryName2",
        SubCategory: [{
            SubCategoryId: 3,
            SubCategoryName: "SubCategoryName3",
        }]
    }],
}]

谢谢你的帮助

function category (arr) {
    // Start with empty array
    ret = new Array();
    // Iterate arr
    for (var i = 0; i < arr.length; i++) {
        // Search MainCategory
        var match = false;
        var j = 0;
        for (j = 0; j < ret.length; j++) {
            if (ret[j].MainCategoryId == arr[i].Category.MainCategory.MainCategoryId) { match = true; break; }
        }
        // If not exist MainCategory
        if (!match) {
            ret.push({
                MainCategoryId: arr[i].Category.MainCategory.MainCategoryId,
                MainCategoryName: arr[i].Category.MainCategory.MainCategoryName,
                Category: []
            });
        }
        // Search Category
        match = false;
        var k = 0;
        for (k = 0; k < ret[j].Category.length; k++) {
            if (ret[j].Category[k].CategoryId == arr[i].Category.CategoryId) { match = true; break; }
        }
        // If not exist Category
        if (!match) {
            ret[j].Category.push({
                CategoryId: arr[i].Category.CategoryId,
                CategoryName: arr[i].Category.CategoryName,
                SubCategory: []
            });
        }
        // Insert Subcategory
        ret[j].Category[k].SubCategory.push({
            SubCategoryId: arr[i].SubCategoryId,
            SubCategoryName: arr[i].SubCategoryName
        });
    }
    // Return new array
    return ret;
}