我想要按对象数组分组,例如 JavaScript 中的特定数组对象

I want Group By Arrays of Objects like specific array objects in JavaScript

我有像这里这样的数组对象:

const mockData = [
    {
        "Id": "596840b0c09b5e6a28433715",
        "Status": 0,
        "CreatedAt": "2020-09-23T08:12:48.378Z",
        "UpdatedAt": "2020-09-23T08:12:48.378Z",
        "Name": {
            "vi": "Việt Nam",
            "en": "Vietnam"
        },
        "AppId": "",
        "ParentId": "",
        "AdminLevel": 2
    },
    {
        "Id": "596840b0c09b5e6a28434717",
        "Status": 0,
        "CreatedAt": "2020-10-16T04:13:35.548Z",
        "UpdatedAt": "2020-10-16T04:13:35.548Z",
        "Name": {
            "vi": "Thành phố Hải Phòng",
            "en": "Hai Phong City"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28433715",
        "AdminLevel": 4
    },
    {
        "Id": "596840b0c09b5e6a28435d6b",
        "Status": 0,
        "CreatedAt": "2020-10-16T04:13:35.548Z",
        "UpdatedAt": "2020-10-16T04:13:35.548Z",
        "Name": {
            "vi": "Thành phố Hồ Chí Minh",
            "en": "Ho Chi Minh City"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28433715",
        "AdminLevel": 4
    },
    {
        "Id": "596840b0c09b5e6a2843535e",
        "Status": 0,
        "CreatedAt": "2020-10-16T04:13:35.548Z",
        "UpdatedAt": "2020-10-16T04:13:35.548Z",
        "Name": {
            "vi": "Thành phố Đà Nẵng",
            "en": "Da Nang City"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28433715",
        "AdminLevel": 4
    },
    {
        "Id": "596840b0c09b5e6a28435e82",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:49.934Z",
        "UpdatedAt": "2020-10-20T02:18:49.934Z",
        "Name": {
            "vi": "Huyện Củ Chi",
            "en": "Cu Chi District"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28435d6b",
        "AdminLevel": 6
    },
    {
        "Id": "596840b0c09b5e6a28435e98",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:49.934Z",
        "UpdatedAt": "2020-10-20T02:18:49.934Z",
        "Name": {
            "vi": "Huyện Hóc Môn",
            "en": "Hoc Mon District"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28435d6b",
        "AdminLevel": 6
    },
    {
        "Id": "596840b0c09b5e6a28435eb6",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:49.934Z",
        "UpdatedAt": "2020-10-20T02:18:49.934Z",
        "Name": {
            "vi": "Huyện Nhà Bè",
            "en": "Nha Be District"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28435d6b",
        "AdminLevel": 6
    },
    {
        "Id": "596840b0c09b5e6a28435d6c",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:49.934Z",
        "UpdatedAt": "2020-10-20T02:18:49.934Z",
        "Name": {
            "vi": "Quận 1",
            "en": "District 1"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a28435d6b",
        "AdminLevel": 6
    },
    {
        "Id": "596840b0c09b5e6a2843538b",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:50.831Z",
        "UpdatedAt": "2020-10-20T02:18:50.831Z",
        "Name": {
            "vi": "Quận Cẩm Lệ",
            "en": "Cam Le District"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a2843535e",
        "AdminLevel": 6
    },
    {
        "Id": "596840b0c09b5e6a28435370",
        "Status": 0,
        "CreatedAt": "2020-10-20T02:18:50.831Z",
        "UpdatedAt": "2020-10-20T02:18:50.831Z",
        "Name": {
            "vi": "Quận Hải Châu",
            "en": "Hai Chau District"
        },
        "AppId": "",
        "ParentId": "596840b0c09b5e6a2843535e",
        "AdminLevel": 6
    }
]

我希望分组变成如下所示:

[
    {
        Id:"596840b0c09b5e6a2843535e",
        AdminLevel: 4, // demo field to understand, will remove in result
        selected: ["596840b0c09b5e6a28435370","596840b0c09b5e6a2843538b"] //array string contains Id of Adminlevel 6 follow ParentId ( is Id of AdminLevel 4 )
    },
     .....//another object with object like on top
     .....
]

说明要:

-分组 Id 遵循 AdminLevel 4.

-选择的是 AdminLevel 6 的字符串数组 IdParentId 与 Adminlevel 4 的 Id 匹配。

我有这方面的代码,但还是不符合我的预期。

let group = mockData.reduce(function (rv, x) {
            if (x.ParentId && x.AdminLevel === 6) {
                (rv[x["ParentId"]] = rv[x["ParentId"]] || []).push(x.Id);
            }
            return rv;
        }, {});

任何人都可以对我的代码有新的解决方案或继续修复吗?非常感谢。

您的 reduce 未对 AdminLevel 4 项目执行任何操作。

检查 AdminLevel 以确定将哪个 属性 用作组密钥,如果累加器对象没有该密钥,则创建新对象。

然后检查 AdminLevel 是否为 6 以将其 Id 推入所选数组

const grouped = mockData.filter(o => [4,6].includes(o.AdminLevel))
               .reduce((acc, {Id, AdminLevel, ParentId})=>{
                    const key = AdminLevel === 4 ? Id: ParentId;
                    acc[key] = acc[key] || {Id, AdminLevel:4, Selected:[]}
                    if(AdminLevel === 6){
                       acc[key].Selected.push(Id);
                    }
                    return acc;                            
                },{});

const res = Object.values(grouped)                       
console.log(res)
.as-console-wrapper {   max-height: 100%!important;top:0;}
<script>
const mockData=[{Id:"596840b0c09b5e6a28433715",Status:0,CreatedAt:"2020-09-23T08:12:48.378Z",UpdatedAt:"2020-09-23T08:12:48.378Z",Name:{vi:"Việt Nam",en:"Vietnam"},AppId:"",ParentId:"",AdminLevel:2},{Id:"596840b0c09b5e6a28434717",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hải Phòng",en:"Hai Phong City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435d6b",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Hồ Chí Minh",en:"Ho Chi Minh City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a2843535e",Status:0,CreatedAt:"2020-10-16T04:13:35.548Z",UpdatedAt:"2020-10-16T04:13:35.548Z",Name:{vi:"Thành phố Đà Nẵng",en:"Da Nang City"},AppId:"",ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435e82",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Củ Chi",en:"Cu Chi District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435e98",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Hóc Môn",en:"Hoc Mon District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435eb6",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Nhà Bè",en:"Nha Be District"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435d6c",Status:0,CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Quận 1",en:"District 1"},AppId:"",ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a2843538b",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Cẩm Lệ",en:"Cam Le District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6},{Id:"596840b0c09b5e6a28435370",Status:0,CreatedAt:"2020-10-20T02:18:50.831Z",UpdatedAt:"2020-10-20T02:18:50.831Z",Name:{vi:"Quận Hải Châu",en:"Hai Chau District"},AppId:"",ParentId:"596840b0c09b5e6a2843535e",AdminLevel:6}];
</script>