• 0

[JavaScript] Loop through Object, grouping every 4 items


Question

I have an object that looks like the following...

rawData = ['Pizza', 'Pepperoni', 'Veggie', 'Hawaiian', 'Coffee', 'Cappuccino', 'Mocha', 'Latte', 'CEOs', 'Tim Cook', 'Mark Zuckerberg', 'Satya Nadella', 'Thanksgiving Food', 'Turkey', 'Cranberry Sauce', 'Pumpkin Pie']

 

I'd like to convert into the following format using JS, but an not sure how to loop through it...

outputData = [
    {
        'category': 'Pizza',
        'example1': 'Pepperoni',
        'example2': 'Veggie',
        'example3': 'Hawaiian'
    },
    {
        'category': 'Coffee',
        'example1': 'Cappuccino',
        'example2': 'Mocha',
        'example3': 'Latte', 
    },
    {
        'category': 'CEOs',
        'example1': 'Tim Cook',
        'example2': 'Mark Zuckerberg',
        'example3': 'Satya Nadella'
    },
    {
        'category': 'Thanksgiving Food',
        'example1': 'Turkey',
        'example2': 'Cranberry Sauce',
        'example3': 'Pumpkin Pie'
    }
]


When you examine the "rawData" object, you'll notice it has 4 sets of data:

  • (Item 1) Category Name.
  • (Items 2, 3 and 4) 3 Examples from that Category.

Then the object repeats. 
 

In my example, I've included 4 sample data sets but I can imagine there could be an n number of them.

I'm awful at loops and this one of driving me nuts!  I hope someone can help me.

8 answers to this question

Recommended Posts

  • 0

Here's a very simple, easy to read solution. Just use a while loop that runs until the array is empty and splice off 4 items at a time off the array after assigning your values to an new object and pushing it to the output array. No complicated for loops or messy index offsets.

 

let outputData = [];

while (rawData.length > 0) {

  outputData.push({
    category: rawData[0],
    example1: rawData[1],
    example2: rawData[2],
    example3: rawData[3]
  });

  rawData.splice(0,4);

}

 

If you need the rawData array to remain untouched just clone the array like this and use that array instead.

let rawClone = [...rawData];

 

I have a hard time believing these questions are for personal projects lol

Edited by PmRd
  • 0
  On 23/11/2023 at 19:44, Brian Miller said:

Thanks! You made it so simple, I didn't think of doing that way.

And yes, this is a home project.  I'll publish my personal in a few weeks and you'll see. 😉 

Expand  

Glad to help

  • 0
  On 23/11/2023 at 19:47, Brian Miller said:

By the way, why did you use "LET" to define the variable, and not a "VAR"?

Is there a difference?

Expand  

Force of habit lol, I usually always work with classes. In this scenario var would work, but if you put that code inside a function that returns the array you're better off using let since it will limit those variables to the scope of the function. I only use var for global variables.

  • 0
  On 23/11/2023 at 19:50, PmRd said:

Force of habit lol, I usually always work with classes. In this scenario var would work, but if you put that code inside a function that returns the array you're better off using let since it will limit those variables to the scope of the function. I only use var for global variables.

Expand  

Thank you.

I'm learning more and more every day.

  • 0

You can do neat stuff like this with let, a scope a basically { anything inside brackets }, and yes you can just put plain brackets anywhere you want. 

{ // scope 1
  
  let test = "test 1";
  let boop = "boop";
  var meep = "meep";
  
  { // scope 2
    
    console.log(boop); //this would return "boop" because this scope is nested therefore it can access variables from its parent scope.
    console.log(test); //however, this would raise an error because a variable with the same name is declared lower in this scope
    let test = "test 2"; // this test variable will only exist in scope 2 and doesn't affect test in scope 1
    console.log(test); //this would return "test 2"
    
  } // scope 2 end
  
  console.log(test); //this would return "test 1" because we are back in scope 1

} // scope 1 end


console.log(meep); //this would return "meep" because var is always global even when delcared inside a scope
console.log(test); //this would raise an error because we are outside scope 1 

It's best practice and saves a lot of headaches to use let inside loops and for temporary variables inside a function. Hope this helps!

Edited by PmRd

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Intel's next-gen desktop processors leak with a whopping number of cores by Taras Buria Intel's third-generation Core Ultra processors for desktop computers are on the way. If the latest leak is true, we are up for some significant updates in the Core Ultra 300 Series. @g01d3nm4ng0 on X posted a list of Intel's upcoming desktop processors, which includes seven SKUs ranging from entry-level Core Ultra 3 models to the flagship Core Ultra 9 with a rather whopping number of cores. According to the leak, the top-end model will feature 52 cores without hyperthreading. However, those cores are not like "classic" cores found in HEDT chips like AMD's Threadrippers. Instead, those 52 cores are divided into three categories: performance, efficiency, and low-power. The upcoming Core Ultra 9 reportedly features 16 performance cores, 32 efficiency cores, and 4 low-power cores. The cheapest Core Ultra 3 has four of each, 12 cores in total. Low-power cores are new to Intel's desktop processors. The current Core Ultra 200 chips feature the same hybrid configuration that was introduced with the 12th-gen Alder Lake chips: performance cores for demanding tasks and efficiency cores for lightweight tasks (up to 24 cores). Now, Intel wants to improve the efficiency of its chips further by adding another set of low-power cores, which were first introduced in the first-gen Core Ultra mobile chips (Meteor Lake). @jaykihn0 adds that Intel Nova Lake-S will support 8000 MT/s memory speed by default and 32 PCIe Gen 5 lanes and 16 PCIe Gen 4 lanes, totalling 48 lanes in CPU + chipset configuration. SKU P Cores E Cores LP Cores TDP Core Ultra 9 16 32 4 150W Core Ultra 7 14 24 4 150W Core Ultra 5 8 16 4 125W Core Ultra 5 8 12 4 125W Core Ultra 5 6 8 4 125W Core Ultra 3 4 8 4 65W Core Ultra 3 4 4 4 65W Today's leak aligns with previous reports about the upcoming Intel Nova Lake-S processors. However, Intel enthusiasts should probably get ready to switch platforms again, as the Nova Lake-S generation is rumored to require a brand-new LGA1954 socket.
    • My mb got a bios update but it just says... is this the fix? - Fix "AMD fTPM switch" option will be hidden. as long as set AMD CPU fTPM to Disabled - AGESA PI-1.2.0.3c released.
  • Recent Achievements

    • Explorer
      treker_ed went up a rank
      Explorer
    • Apprentice
      CHUNWEI went up a rank
      Apprentice
    • Veteran
      1337ish went up a rank
      Veteran
    • Rookie
      john.al went up a rank
      Rookie
    • Week One Done
      patrickft456 earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      656
    2. 2
      ATLien_0
      272
    3. 3
      +FloatingFatMan
      176
    4. 4
      Michael Scrip
      157
    5. 5
      Steven P.
      136
  • Tell a friend

    Love Neowin? Tell a friend!