Home > Blockchain >  Iterating over JSON nested object to create new object
Iterating over JSON nested object to create new object

Time:10-22

I have the following data:

  export interface BreakTimes {
    start? : string;
    end?   : string;
  }

  export interface WorkingPlanDays {
    start? : string;
    end?   : string;
    breaks? : BreakTimes[];
  }

  export interface WorkingPlan {
    [day : string]  : WorkingPlanDays;
  }

  const WORKING_PLAN_DATA: WorkingPlan = {
        "monday": null,
        "tuesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "wednesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "thursday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "friday": {
          "start": "09:00",
          "end": "20:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "14:30"
            }
          ]
        },
        "saturday": {
          "start": "09:00",
          "end": "17:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "sunday": null
  }

What I am trying to achieve is getting the break times in a new object like so:

  const ELEMENT_DATA: Breaks[] = [
    {day: 'Tuesday', start: '12:00', end: '12:30'},
    {day: 'Tuesday', start: '13:30', end: '13:50'},
    {day: 'Wednesday', start: '12:00', end: '12:30'},
    {day: 'Wednesday', start: '13:30', end: '13:50'},
    ...... etc....
  ];

What is the best way to do so? I'm pretty new to javascript and typescript, getting a little confused on how to iterate over this object that has nested objects within.

If you have the answer could you please also explain how your code works to give me a better understanding? Much appreciated guys!

CodePudding user response:

Perhaps something like this snippet will be useful to get you started. Good luck.

(Edited to add version close to OP's desired output.)

See for in loops and Array.forEach

const WorkingPlan = {
        "monday": null,
        "tuesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "wednesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "thursday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "friday": {
          "start": "09:00",
          "end": "20:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "14:30"
            }
          ]
        },
        "saturday": {
          "start": "09:00",
          "end": "17:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "sunday": null
  }
  let day, breaks = new Array();
  for ( day in WorkingPlan ) {
    if ( WorkingPlan[day] && "breaks" in WorkingPlan[day] ) {
      breaks.push( {day: day, breaks: WorkingPlan[day].breaks});
    }
  }
  
  console.log(breaks);
  
  breaks =[];
  
for ( day in WorkingPlan ) {
    if ( WorkingPlan[day] && "breaks" in WorkingPlan[day] ) {
      WorkingPlan[day].breaks.forEach( v => {
      breaks.push( {day: day, start: v.start, end: v.end});
      });
    }
  }
    
  console.log(breaks);

CodePudding user response:

const iterate = (obj) => {
const result = []
    Object.keys(obj).forEach(key => {

    if (typeof obj[key] === 'object' && obj[key] !== null && obj[key].breaks) {
        obj[key].breaks.forEach(time=>{
      result.push({day:key, start: time.start,end:time.end})
      })
          
        }
    })
    return result
}

const response = iterate({
        "monday": null,
        "tuesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "wednesday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "thursday": {
          "start": "09:00",
          "end": "17:30",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "friday": {
          "start": "09:00",
          "end": "20:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "14:30"
            }
          ]
        },
        "saturday": {
          "start": "09:00",
          "end": "17:00",
          "breaks": [
            {
              "start": "12:00",
              "end": "12:30"
            },
            {
              "start": "13:30",
              "end": "13:50"
            }
          ]
        },
        "sunday": null
  })
  
  console.log(response)

You can try this solution

  • Related