Add a (key : value) into a infinite nested children object
Asked Answered
M

3

6

I have an Array like below (code session 2) . And I want add id : random into {child Obj} like this:

{
  name : "Peter",
  age : "18",
  profession : "nurse",
  id : String(Math.random())
  children : [],
 }

But it have 2 cases : value of key children may be [ ] or [ length !== 0 ]. I want to loop infinity the parent Array and add id for all.

Note : value of key children inside every {childObj} maybe an Array look like Parent Array. My final target is set id for all element from response API look like the template array

Thank you too much and sorry about my English if it make you feel complex

[{
  name : "Peter",
  age : "18",
  profession : "nurse",
  children : []
 }
 { 
   name: "Jack",
   age: "98" ,
   profession: "doctor",
   children: [ {
                 name : "Peter",
                 age : "18",
                 profession : "nurse",
                children : []
               },
               {
                 name: "Varun",
                 age: "80"
                 profession: "scientist"
                 children: [
                             {
                                name: "Ishan"
                                age: "62",
                                profession: "teacher
                                children: [{....
                                 .....
                                 .....[{
                                       name: "Rahul",
                                       age: "23",
                                       profession: "engineer"
                                      children: [{
                                                  .....
Mongol answered 8/6, 2020 at 11:17 Comment(2)
As I understand it you want to go through the array and add an id for each object (parent / child), correct?Kyliekylila
Yes sir, but inside a child have a key that maybe has an array like big array. It maybe infinityMongol
I
7

You can use .map() on your original data array, which returns the object along with its id. The children in the mapped object will be a mapped array, again using the same mapping function like so:

const data = [{ name: "Peter", age: "18", profession: "nurse", children: [] }, { name: "Jack", age: "98", profession: "doctor", children: [{ name: "Peter", age: "18", profession: "nurse", children: [] }, { name: "Varun", age: "80", profession: "scientist", children: [{ name: "Ishan", age: "62", profession: "teacher", children: [{ name: "Rahul", age: "23", profession: "engineer", children: [] }] }] } ] } ];

const res = data.map(function mapId({children, ...r}) {
  return {...r, id: String(Math.random()), children: children.map(mapId)};
});
console.log(res);
Incentive answered 8/6, 2020 at 11:32 Comment(0)
S
1

A good use case case of recursion:

var data = [{
  name : "Peter",
  age : "18",
  profession : "nurse",
  children : []
 },
 { 
   name: "Jack",
   age: "98" ,
   profession: "doctor",
   children: [ {
                 name : "Peter",
                 age : "18",
                 profession : "nurse",
                children : []
               },]
}
]
function addIdRecursively(data){
   data.forEach(i=> {
       i.id = String(Math.floor(Math.random()*10));
       if(i.children.length>0){
         addIdRecursively(i.children)
       }
  })
}
addIdRecursively(data);

console.log(data)
Smuggle answered 18/6, 2020 at 2:37 Comment(1)
This came in clutch for me today! +1Morrow
G
0
const obj = [{
  name: "Jack",
  age: "98",
  profession: "doctor",
  children: [
    {
      name: "Peter",
      age: "18",
      profession: "nurse",
      children: [],
    },
    {
      name: "Varun",
      age: "80",
      profession: "scientist",
      children: [
        {
          name: "Ishan",
          age: "62",
          profession: "teacher",
          children: [],
        },
      ],
    },
  ],
}];

const f = (_) => ({..._, id: String(Math.random()), children: _.children.map(f) })

console.log(obj.map(f));
Gretagretal answered 8/6, 2020 at 11:31 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.