Arter
Arter

Reputation: 2324

Loop inside for loop - nested arrays

I have for loop inside for loop... and my array output is nested array [[{...}]] but I need [{...}]

Is there any way to make this array without nested array in this case?

Here is my code... I have users and for every user i need to add new array of objects

users = [{
  name: "user1"
  role: ["admin", "tester", "viewer"]
  },{
  name: "user2"
  role: ["admin", "tester", "viewer"]
  }]

userRole: any[]=[];


for (let user of users){
 for (let u of user.role){
     this.userRole.push({
         name: user.name,
         role: u
     }) 
    }
    this.data.push(this.userRole) 
   }

User can have multiple role, but because of database structure I need in user object send array with object

{ "name": "user1",
   "role": [{
        "role" : "admin",
        "user" : "user1"
       },{
        "role" : "tester",
        "user" : "user1"
       },{
        "role" : "view",
        "user" : "user1"
       }]
  }

but I get this

{ "name": "user1",
   "role": [  // nested array
        [{
        "role" : "admin",
        "user" : "user1"
       },{
        "role" : "tester",
        "user" : "user1"
       },{
        "role" : "view",
        "user" : "user1"
       }]
     ]
  }

I try to use .flat() but still the same

Upvotes: 1

Views: 135

Answers (6)

Arter
Arter

Reputation: 2324

Here is the answer, thnx to user @CodeManiac, he gave me a way of thinking...

I need to push item inside second for-loop... and now everything works like I expect

for (let user of users){
  for (let u of user.role){
     this.data.push(name: user.name, role: u) 
 }
}

Upvotes: 0

Srinivas
Srinivas

Reputation: 364

users = [{
  name: "user1",
  role: ["admin", "tester", "viewer"],
  },{
  name: "user2",
  role: ["admin", "tester", "viewer"],
  }
]


userRole = users.map(user => {
  roles = user.role.map(x => {
    return {role:x,user:user.name}
  })

   return { 
      name: user.name,
      role: roles
   }
})
console.log(userRole)

Upvotes: 1

Code Maniac
Code Maniac

Reputation: 37775

You can simply use two map

let users = [{name: "user1",role: ["admin", "tester", "viewer"]}, {name: "user2",role: ["admin", "tester", "viewer"]}]

let final = users.map(({name,role})=>{
  return {
    name,
    role: role.map(user=>({name,user}))
  }
})

console.log(final)


To make your code work, all you need is defined two variable one to hold the final value and another one to hold userRole for particular user,

const users = [{name: "user1",role: ["admin", "tester", "viewer"]}, {name: "user2", role: ["admin", "tester", "viewer"]}]
const final = []

for (let user of users) {
  const userRole = [];
  for (let u of user.role) {
    userRole.push({
      name: user.name,
      role: u
    })
  }
  final.push({name:user.name, role: userRole})
}

console.log(final)

Upvotes: 3

vipul patel
vipul patel

Reputation: 736

Please use flatMap :

var data = { "name": "user1",
            "role": [  // nested array
             [{
            "role" : "admin",
            "user" : "user1"
           },{
            "role" : "tester",
            "user" : "user1"
           },{
            "role" : "view",
            "user" : "user1"
           }]
           ]
          };
          
          
          
          data.role =   data.role.flatMap(data => data);          
          console.log("print data object");
          console.log(data)

Upvotes: 1

Søren Andersen
Søren Andersen

Reputation: 23

Why don't you use the "u" in the second for loop, to add your array of roles?

Upvotes: 0

Yvan
Yvan

Reputation: 1121

I made some change on your code. Every loop you are creating a new role, I supposed this.data is a array of userRole? So, you can add it every loop on your data array.

for (let user of users){
 for (let u of user.role){
     const userRole= { name: user.name, role: u};
     this.userRole.push(userRole);
     this.data.push(userRole) 
  }
}

Upvotes: 1

Related Questions