Home > Back-end >  map array with more than one object into another array
map array with more than one object into another array

Time:09-20

This is the original Array: It can have one or more objects. In each object there is an adress and an array of mitglieder.

    const original = [
    {
      "adresse":{
        "strasse":"Streetone",
        "plz":"55555",
        "ort":"Hamburg",
        "xy": "aaaaaa"
      },
      "mitglieder":[
        {
          "zugestimmt":true,
          "nummer":"345",
          "nachname":"Meier",
          "vorname":"Peter",
          "geburtsDatum":"1980-01-01"
        },
        {
          "zugestimmt":true,
          "nummer":"435",
          "nachname":"Haushalt",
          "vorname":"Anderer",
          "geburtsDatum":"1980-01-01"
        },
      ]
    },
    {
      "adresse":{
        "street":"Streettwo",
        "plz":"34444",
        "ort":"Hamburg",
        "xy": "bbbbb"
      },
      "mitglieder":[
        {
          "zugestimmt":true,
          "nummer":"345",
          "nachname":"Muster",
          "vorname":"Maria",
          "geburtsDatum":"1980-01-01",
          "xy" : {a:'1', b:'2'}
        },
        {
          "zugestimmt":true,
          "nummer":"345",
          "nachname":"Muster",
          "vorname":"Maria",
          "geburtsDatum":"1980-01-01",
          "xy" : {a:'1', b:'2'}
        },
      ]
    }
  ];

And I want to map it into this Array: This should be an array of the mitglieder of all the objects from the original array. The street, plz and ort ist from the adress key. The "arrayIwant" should only have these properties not the property"xy" or other that can be in the original array.

let arrayIwant = [
    {
    vorname: original[0].mitglieder[0].vorname,
    nachname: original[0].mitglieder[0].nachname,
    geburtsdatum: original[0].mitglieder[0].geburtsDatum,
    zugestimmt: original[0].mitglieder[0].zugestimmt,
    strasse: original[0].adressse.street,
    plz: original[0].adresse.plz,
    ort: original[0].adresse.ort,
    
  },
  {
     vorname: original[0].mitglieder[1].vorname,
    nachname: original[0].mitglieder[1].nachname,
    geburtsdatum: original[0].mitglieder[1].geburtsDatum,
    zugestimmt: original[0].mitglieder[1].zugestimmt,
    strasse: original[0].adresse.street,
    plz: original[0].adresse.plz,
    ort: original[0].adresse.ort,
  },
  {
    vorname: original[1].mitglieder[0].vorname,
    nachname: original[1].mitglieder[0].nachname,
    geburtsdatum: original[1].mitglieder[0].geburtsDatum,
    zugestimmt: original[1].mitglieder[0].zugestimmt,
    strasse: original[1].adresse.street,
    plz: original[1].adresse.plz,
    ort: original[1].adresse.ort,
  },
  {
    vorname: original[1].mitglieder[1].vorname,
    nachname: original[1].mitglieder[1].nachname,
    geburtsdatum: original[1].mitglieder[1].geburtsDatum,
    zugestimmt: original[1].mitglieder[1].zugestimmt,
    strasse: original[1].adresse.street,
    plz: original[1].adresse.plz,
    ort: original[1].adresse.ort,
  }
 ]

thanks for your help

CodePudding user response:

Use Array#flatMap and Array#map with the spread operator as follows:

const 
    original = [ { "adresse":{ "street":"Streetone", "plz":"55555", "ort":"Hamburg" }, "mitglieder":[ { "zugestimmt":true, "nummer":"345", "nachname":"Meier", "vorname":"Peter", "geburtsDatum":"1980-01-01" }, { "zugestimmt":true, "nummer":"435", "nachname":"Haushalt", "vorname":"Anderer", "geburtsDatum":"1980-01-01" }, ] }, { "adresse":{ "street":"Streettwo", "plz":"34444", "ort":"Hamburg" }, "mitglieder":[ { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01" }, { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01" }, ] } ],

    output = original.flatMap(
        ({adresse,mitglieder}) => 
            mitglieder.map(mitg => delete mitg.nummer && ({...mitg,...adresse}))
    );

    console.log( output );

Alternatively .... .. .

You may have to list all the desired sub-properties from the two properties as show in this demo. In the process you can alias any property whose name you would like to change for example to change street to strasse alias like so: street:strasse then use strasse in the final object as shown.

const 
    original = [ { "adresse":{ "street":"Streetone", "plz":"55555", "ort":"Hamburg", "xy": "aaaaaa" }, "mitglieder":[ { "zugestimmt":true, "nummer":"345", "nachname":"Meier", "vorname":"Peter", "geburtsDatum":"1980-01-01" }, { "zugestimmt":true, "nummer":"435", "nachname":"Haushalt", "vorname":"Anderer", "geburtsDatum":"1980-01-01" }, ] }, { "adresse":{ "street":"Streettwo", "plz":"34444", "ort":"Hamburg", "xy": "bbbbb" }, "mitglieder":[ { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01", "xy" : {a:'1', b:'2'} }, { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01", "xy" : {a:'1', b:'2'} }, ] } ],

    output = original.flatMap(
        ({
            adresse: {street: strasse,plz,ort},
            mitglieder //still an array of objects, so wait ...
        }) =>
        mitglieder.map(
            //now you have an object, so you can list the desired props:
            ({vorname,nachname,geburtsDatum,zugestimmt}) =>
            ({vorname,nachname,geburtsDatum,zugestimmt,strasse,plz,ort})
        )
    );

    console.log( output );

CodePudding user response:

This is straightforward. You want to create a new object for every element of the mitglieder array in every element of your original array.

 let original = [
   { "adresse":{ "street":"Streetone", "plz":"55555", "ort":"Hamburg", "xy": "aaaaaa" }
   , "mitglieder":
     [ { "zugestimmt":true, "nummer":"345", "nachname":"Meier", "vorname":"Peter", "geburtsDatum":"1980-01-01" }
     , { "zugestimmt":true, "nummer":"435", "nachname":"Haushalt", "vorname":"Anderer","geburtsDatum":"1980-01-01" },
     ]
   },
   { "adresse":{ "street":"Streettwo", "plz":"34444", "ort":"Hamburg", "xy": "aaaaab"}
   , "mitglieder":
     [ { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01" }
     , { "zugestimmt":true, "nummer":"345", "nachname":"Muster", "vorname":"Maria", "geburtsDatum":"1980-01-01" },
     ]
   }
]

let adressePropMap = { 'street': 'strasse', 'plz': 'plz', 'ort': 'ort' }
myArray = original.reduce( (accum, elem) => {
  elem.mitglieder.forEach( (mitglieder) => {
    obj = {}                         // create the new object
    for (const[from, to] of Object.entries(adressePropMap )) {
      obj[to] = elem.adresse[from]
    }
    Object.assign(obj, mitglieder)   // copy the mitglieder properties
    delete obj.nummer                // remove unwanted property
    accum.push(obj)                  // put the new object into the accumulator
  })
  return accum
}, [])

console.log(myArray)

CodePudding user response:

I have done a map on the Output Array with the props I need:

const result = output.map(mitglied => ({
      vorname: mitglied.vorname,
      nachname: mitglied.nachname,
      geburtsDatum: mitglied.geburtsDatum,
      zugestimmt: mitglied.zugestimmt,
      strasse: mitglied.street,
      plz: mitglied.plz,
      ort: mitglied.ort
    }))

Now i have only the props i need in my result. Thanks PeterKA and Tribrogargan for the help.

  • Related