Подгруппа массива объектов внутри подмассивов основного массива - PullRequest
0 голосов
/ 28 мая 2020

У меня есть такой массив

[
    {
        "id": 1,
        "name": "Personal Information",
        "TabFields": [
            {
                "name": "First Name",
                "field": {
                    "code": "personFirstName"
                }
            },
            {
                "name": "Gender",
                "field": {
                    "code": "personGenderD"
                }
            },
            {
                "name": "Last Name",
                "field": {
                    "code": "personLastName"
                }
            },
            {
                "name": "Mobile Number",
                "field": {
                    "code": "mobileNumber"
                }
            },
            {
                "name": "Email Address",
                "field": {
                    "code": "emailAddress"
                }
            }
        ]
    }
]

Мне нужно сгруппировать objects внутри TabFields на их соответствующую ВКЛАДКУ ( PERSONAL_INFORMATION , CONTACT_DETAILS ) на code значение внутри объекта field

Объект

"name": "First Name",
"field": {
    "code": "personFirstName"
}
"name": "Gender",
"field": {
    "code": "personGenderD"
}
"name": "Last Name",
"field": {
    "code": "personLastName"
}

принадлежит ПЕРСОНАЛЬНАЯ_ИНФОРМАЦИЯ и объект

"name": "Mobile Number",
"field": {
    "code": "mobileNumber"
}
"name": "Email Address",
"field": {
    "code": "emailAddress"
}

принадлежит CONTACT_DETAILS . Таким образом, результат будет

[
    {
        "id": 1,
        "name": "Personal Information",
        "TabFields": [
            {
                "label": "PERSONAL_INFORMATION",
                "code": "PERSONAL_INFORMATION",
                "fields": [
                    {
                        "name": "First Name",
                        "field": {
                            "code": "personFirstName"
                        }
                    },
                    {
                        "name": "Gender",
                        "field": {
                            "code": "personGenderD"
                        }
                    },
                    {
                        "name": "Last Name",
                        "field": {
                            "code": "personLastName"
                        }
                    }
                ]
            },
            {
                "label": "CONTACT_DETAILS",
                "code": "PERSONAL_INFORMATION",
                "fields": [
                    {
                        "name": "Mobile Number",
                        "field": {
                            "code": "mobileNumber"
                        }
                    },
                    {
                        "name": "Email Address",
                        "field": {
                            "code": "emailAddress"
                        }
                    }
                ]
            }
        ]
    }
]

Как это сделать в javascript?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы также можете сделать это с помощью map:

var arr=[ { "id": 1, "name": "Personal Information", "TabFields": [ { "name": "First Name", "field": { "code": "personFirstName" } }, { "name": "Gender", "field": { "code": "personGenderD" } }, { "name": "Last Name", "field": { "code": "personLastName" } }, { "name": "Mobile Number", "field": { "code": "mobileNumber" } }, { "name": "Email Address", "field": { "code": "emailAddress" } } ] }];

personalContact = ["Mobile Number", "Email Address"];

result = arr.map(val=>{
    personalInfo = { label:'personal', code:val.name, fields:val.TabFields.filter(k=>!personalContact.includes(k.name))};
    contactInfo = { label:'contact', code:val.name, fields:val.TabFields.filter(k=>personalContact.includes(k.name))};
    val.TabFields = [personalInfo, contactInfo];
    return val;
});

console.log(result);

Идея заключалась бы в том, чтобы иметь массив, который должен различать guish между contact details и personal details, используя который вы можете применить filter, чтобы получить данные.

1 голос
/ 28 мая 2020

Вы можете express преобразовывать просто с помощью созданной мной библиотеки rubico .

const { pipe, fork, assign, get, map, filter } = require('rubico')

const PERSONAL_INFORMATION_FIELDS = new Set(['First Name', 'Gender', 'Last Name'])

const CONTACT_DETAILS_FIELDS = new Set(['Mobile Number', 'Email Address'])

// [datum] => [datum_with_grouped_TabFields]
const groupTabFields = assign({ // reassign TabFields to new grouped TabFields
  TabFields: fork([
    fork({
      label: () => 'PERSONAL_INFORMATION',
      code: () => 'PERSONAL_INFORMATION',
      fields: pipe([
        get('TabFields'), // datum => datum.TabFields
        filter(pipe([ // FILTER: for each TabField of TabFields
          get('name'), // TabField => TabField.name
          field => PERSONAL_INFORMATION_FIELDS.has(field), // check if PERSONAL_INFORMATION_FIELDS has name
        ])),
      ]),
    }),
    fork({ // same as above but with contact details
      label: () => 'CONTACT_DETAILS',
      code: () => 'CONTACT_DETAILS',
      fields: pipe([
        get('TabFields'),
        filter(pipe([
          get('name'),
          field => CONTACT_DETAILS_FIELDS.has(field)
        ])),
      ]),
    }),
  ]),
})

x = map(groupTabFields)(data)

console.log(JSON.stringify(x, null, 2)) // output is what you wanted

Я добавил несколько комментариев, но для более глубокого понимания библиотеки и кода Я дал вам, я рекомендую прочитать интуицию , а затем прочитать документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...