1

Probably a basic question, but I've been blocked for a day now on this. I am trying to get the correct map/filter from the following array:

[{
    "id": 1,
    "description": "Electric",
    "subUtilityTypes": [{
        "id": 5,
        "description": "Grid"
      },
      {
        "id": 6,
        "description": "Solar"
      }
    ]
  },
  {
    "id": 2,
    "description": "Gas",
    "subUtilityTypes": [{
        "id": 7,
        "description": "Heating Oil"
      },
      {
        "id": 8,
        "description": "Natural Gas"
      },
      {
        "id": 11,
        "description": "Propane"
      }
    ]
  }
]

I want to get the id and description inside all subUtilityTypes.

This is what I've been trying:

this.options = arr1.map((parent) => {
  return {
    id: parent.id,
    name: parent.subUtilityTypes.flatMap((child) => {
      return child.description;
    })
  };
});

My problem with what I am trying is that instead of creating separate objects I am getting parent id and list of child names like this:

[{
    "id": 1,
    "name": [
      "Grid",
      "Solar"
    ]
  },
  {
    "id": 2,
    "name": [
      "Heating Oil",
      "Natural Gas",
      "Propane"
    ]
  }
]

Expected result should look like this:

[{
    "id": 5,
    "name": [
      "Grid"
    ]
  },
  {
    "id": 6,
    "name": [
      "Solar"
    ]
  },
  {
    "id": 7,
    "name": [
      "Heating Oil"
    ]
  }
]
0

3 Answers 3

3

Firstly use flatMap to get subUtilityTypes, then map entries:

const input = [{id:1,description:"Electric",subUtilityTypes:[{id:5,description:"Grid"},{id:6,description:"Solar"}]},{id:2,description:"Gas",subUtilityTypes:[{id:7,description:"Heating Oil"},{id:8,description:"Natural Gas"},{id:11,description:"Propane"}]}];

const res = input.flatMap(e => e.subUtilityTypes)
                 .map(e => ({ id: e.id, name: [e.description] }))
                 
console.log(res)
.as-console-wrapper { max-height: 100% !important; top: 0; } /* ignore this */

Sign up to request clarification or add additional context in comments.

Comments

2

Map only arr1 by returning only subUtilityTypes and then map it to get the desired result :

 arr1.flatMap(item=>item.subUtilityTypes)
       .map(item=>({id:item.id,name:[item.description]}))

let arr1=[
    {
        "id": 1,
        "description": "Electric",
        "subUtilityTypes": [
            {
                "id": 5,
                "description": "Grid"
            },
            {
                "id": 6,
                "description": "Solar"
            }
        ]
    },
    {
        "id": 2,
        "description": "Gas",
        "subUtilityTypes": [
            {
                "id": 7,
                "description": "Heating Oil"
            },
            {
                "id": 8,
                "description": "Natural Gas"
            },
            {
                "id": 11,
                "description": "Propane"
            }
        ]
    }
]

let options=arr1.flatMap(item=>item.subUtilityTypes).map(item=>({id:item.id,name:[item.description]}))

console.log(options)

Comments

2

You can also use reduce to achieve the same result.

arr.reduce((acc, curr) => [...acc,...curr.subUtilityTypes.map((o) => ({ id: o.id, name: [o.description] })),],[])

const arr = [
  {
    id: 1,
    description: "Electric",
    subUtilityTypes: [
      {
        id: 5,
        description: "Grid",
      },
      {
        id: 6,
        description: "Solar",
      },
    ],
  },
  {
    id: 2,
    description: "Gas",
    subUtilityTypes: [
      {
        id: 7,
        description: "Heating Oil",
      },
      {
        id: 8,
        description: "Natural Gas",
      },
      {
        id: 11,
        description: "Propane",
      },
    ],
  },
];

const result = arr.reduce((acc, curr) => [...acc,...curr.subUtilityTypes.map((o) => ({ id: o.id, name: [o.description] })),],[]);
console.log(result);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.