1

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

6
  • this.data = this.data.concat(this.userRole) ? Commented Oct 16, 2019 at 11:21
  • what would help is an example of users object Commented Oct 16, 2019 at 11:23
  • @CodeManiac I don't need to merge... i need to push item Commented Oct 16, 2019 at 11:25
  • @Bravo I will update my question Commented Oct 16, 2019 at 11:25
  • Can you given an example or users Commented Oct 16, 2019 at 11:26

6 Answers 6

3

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)

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

1 Comment

You give me the proper way... but i need to make sam change... but thnx
1

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) 
  }
}

Comments

1

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)

Comments

1
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)

Comments

0

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

1 Comment

because I need every role in single object
0

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) 
 }
}

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.