如何通过使用map分离对象数组?

时间:2020-09-02 12:21:07

标签: javascript angular

我必须基于id在另一个对象数组中形成一个对象数组。我能够根据“ 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 个答案:

答案 0 :(得分:2)

您可以使用几个数组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


侧注:请尝试在问题中发布有效的对象。这样可以更轻松,更快速地重现该问题。我的大部分时间都花在了解决方案上,而不是在修复对象上。