我想要像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","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"
        },"ParentId": "596840b0c09b5e6a28433715","AdminLevel": 4
    },{
        "Id": "596840b0c09b5e6a28435d6b","Name": {
            "vi": "Thành phố Hồ Chí Minh","en": "Ho Chi Minh City"
        },{
        "Id": "596840b0c09b5e6a2843535e","Name": {
            "vi": "Thành phố Đà Nẵng","en": "Da Nang City"
        },{
        "Id": "596840b0c09b5e6a28435e82","CreatedAt": "2020-10-20T02:18:49.934Z","UpdatedAt": "2020-10-20T02:18:49.934Z","Name": {
            "vi": "Huyện Củ Chi","en": "Cu Chi district"
        },"ParentId": "596840b0c09b5e6a28435d6b","AdminLevel": 6
    },{
        "Id": "596840b0c09b5e6a28435e98","Name": {
            "vi": "Huyện Hóc Môn","en": "Hoc Mon district"
        },{
        "Id": "596840b0c09b5e6a28435eb6","Name": {
            "vi": "Huyện Nhà Bè","en": "Nha Be district"
        },{
        "Id": "596840b0c09b5e6a28435d6c","Name": {
            "vi": "Quận 1","en": "district 1"
        },{
        "Id": "596840b0c09b5e6a2843538b","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"
        },"ParentId": "596840b0c09b5e6a2843535e",{
        "Id": "596840b0c09b5e6a28435370","Name": {
            "vi": "Quận Hải Châu","en": "Hai Chau district"
        },"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的字符串数组Id,具有ParentId与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",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"},ParentId:"596840b0c09b5e6a28433715",AdminLevel:4},{Id:"596840b0c09b5e6a28435d6b",Name:{vi:"Thành phố Hồ Chí Minh",en:"Ho Chi Minh City"},{Id:"596840b0c09b5e6a2843535e",Name:{vi:"Thành phố Đà Nẵng",en:"Da Nang City"},{Id:"596840b0c09b5e6a28435e82",CreatedAt:"2020-10-20T02:18:49.934Z",UpdatedAt:"2020-10-20T02:18:49.934Z",Name:{vi:"Huyện Củ Chi",en:"Cu Chi District"},ParentId:"596840b0c09b5e6a28435d6b",AdminLevel:6},{Id:"596840b0c09b5e6a28435e98",Name:{vi:"Huyện Hóc Môn",en:"Hoc Mon District"},{Id:"596840b0c09b5e6a28435eb6",Name:{vi:"Huyện Nhà Bè",en:"Nha Be District"},{Id:"596840b0c09b5e6a28435d6c",Name:{vi:"Quận 1",en:"District 1"},{Id:"596840b0c09b5e6a2843538b",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"},ParentId:"596840b0c09b5e6a2843535e",{Id:"596840b0c09b5e6a28435370",Name:{vi:"Quận Hải Châu",en:"Hai Chau District"},AdminLevel:6}];
</script>