Как разделить массив объектов с помощью map?

#javascript #angular

#javascript #angular

Вопрос:

Я должен сформировать массив объектов в другом массиве объектов на основе идентификатора. Я смог сгруппировать объект на основе «applicationId», но не смог сгруппировать внутренний массив атрибутов и массив значений. Также приведенный выше код выдает мне повторяющиеся объекты. Пожалуйста, помогите с этим, я знаю, что это небольшое исправление, но я провожу целый день без результата.stackblitz. Ожидаемый результат, прокомментированный ниже в stackblitz

  data.map((el) => {
      el.attribute.map((elm) => {
        elm.options.map(em => {
          permissions.push({
            applicationId: el.application, attributes: [{ name: elm.name, value: em.value, disabled: true 
          }]
          })
        })
      })
    });
  

Входной объект

 [
    {
        application: "abc", 
        attribute: [
            {
                description: "abc description1"
                name: "audio"
                options:[
                    {name: "Yes", value: "Y"}
                    {name: "No", value: "N"}
                ]
            },
            {
                description: "abc description2"
                name: "video"
                options:[
                    {name: "true", value: "T"}
                    {name: "false", value: "F"}
                ]
            }
            {
                description: "abc description3"
                name: "call"
                options:[
                    {name: "Yes", value: "Y"}
                    {name: "false", value: "F"}
                ]
            }
        ]
    },
    {
        application: "def", 
        attribute: [
            {
                description: "def description1"
                name: "audio"
                options:[
                    {name: "Yes", value: "Y"}
                    {name: "No", value: "N"}
                ]
            },
            {
                description: "def description2"
                name: "video"
                options:[
                    {name: "true", value: "T"}
                    {name: "false", value: "F"}
                ]
            }
            {
                description: "def description3"
                name: "call"
                options:[
                    {name: "Yes", value: "Y"}
                    {name: "false", value: "F"}
                ]
            }
        ]
    }
]
  

Ожидаемый результат:

 permissions:[
    {
    applicationId:abc
    attributes:
        [
            {
            name:audio
            value:["Y","N"]
            disabled: true
            },
            {
            name:video,
            value:["T","F"]
            disabled: true
            },
            {
            name:call,
            value:["Y","F"]
            disabled: true
            }
        ]
    },
    {
    applicationId: def
    attributes:
        [
            {
            name:audio
            value:["Y","N"]
            disabled: true
            },
            {
            name:video,
            value:["T","F"]
            disabled: true
            },
            {
            name:call,
            value:["Y","F"]
            disabled: true
            }
        ]
    }
]
  

Комментарии:

1. Я указал выходные данные, можете ли вы увидеть ожидаемый результат

Ответ №1:

Вы могли бы сделать это, используя несколько массивов map .

Попробуйте следующее

 var input = [ { application: "abc", attribute: [ { description: "abc description1", name: "audio", options: [ { name: "Yes", value: "Y" }, { name: "No", value: "N" } ] }, { description: "abc description2", name: "video", options: [ { name: "true", value: "T" }, { name: "false", value: "F" } ] }, { description: "abc description3", name: "call", options: [ { name: "Yes", value: "Y" }, { name: "false", value: "F" } ] } ] }, { application: "def", attribute: [ { description: "def description1", name: "audio", options: [ { name: "Yes", value: "Y" }, { name: "No", value: "N" } ] }, { description: "def description2", name: "video", options: [ { name: "true", value: "T" }, { name: "false", value: "F" } ] }, { description: "def description3", name: "call", options: [ { name: "Yes", value: "Y" }, { name: "false", value: "F" } ] } ] } ];

var output = input.map(item => ({
  applicationId: item.application,
  attributes: item.attribute.map(attr => ({
    name: attr.name,
    value: attr.options.map(option => option.value),
    disabled: true
  }))
}));


console.log(output);  

Я изменил ваш Stackblitz.


Примечание: Пожалуйста, попробуйте опубликовать действительный объект в вопросе. Это значительно упростит и ускорит воспроизведение проблемы. Большая часть моего времени была потрачена не на решение, а на исправление объекта.

Комментарии:

1. Большое вам спасибо, все работает отлично…. Я трачу на это полдня без какого-либо результата, вы спасли мой день