0

I have an object like this

const countries = {
  iran: {
    capital : 'Tehran',
    population  : '83183741',
    area    : '1648195'
  },
  uk: {
    capital : 'London',
    population  : '6708100',
    area    : '242495'
  },
  us: {
    capital : 'Washington D.C.',
    population  : '332641717',
    area    : '9525067'
  },
  ukraine: {
    capital : 'Kyiv',
    population  : '44983019',
    area    : '603500'
  }
};

How I can get an output like this?

iran,capital,Tehran
iran,population,83183741
iran,area,1648195
uk,capital,Tehran
uk,population,6708100
uk,area,242495
....
ukrane,capital,603500
ukrane,population,41130432
ukrane,area,603500

const countries = {
  iran: {
    capital : 'Tehran',
    population  : '83183741',
    area    : '1648195'
   
  },
  uk: {
    capital : 'London',
    population  : '6708100',
    area    : '242495'
   
  },
  us: {
    capital : 'Washington D.C.',
    population  : '332641717',
    area    : '9525067'
   
  },
  ukrane: {
    capital : 'Kiev',
    population  : '41130432 ',
    area    : '603500'
   
  }
};
  

var i = 1;
for (const country in countries) {
  console.log(country);
  for (let x in country) {
    console.log(country[x])
}
  i++
}

5 Answers 5

3

You were close. The only thing you've missed is that a for..in loop gives you the key, not the value. So, you have to access the given key on the object like this:

const countries = {
  iran: {
    capital : 'Tehran',
    population  : '83183741',
    area    : '1648195'
   
  },
  uk: {
    capital : 'London',
    population  : '6708100',
    area    : '242495'
   
  },
  us: {
    capital : 'Washington D.C.',
    population  : '332641717',
    area    : '9525067'
   
  },
  ukrane: {
    capital : 'Kiev',
    population  : '41130432 ',
    area    : '603500'
   
  }
};
  

for (const country in countries) {
  console.log(country);
  for (const property in countries[country]) {
    console.log(countries[country][property])
  }
}

From there, you can easily concatenate the pieces of information you need:

const countries = {
  iran: {
    capital : 'Tehran',
    population  : '83183741',
    area    : '1648195'
   
  },
  uk: {
    capital : 'London',
    population  : '6708100',
    area    : '242495'
   
  },
  us: {
    capital : 'Washington D.C.',
    population  : '332641717',
    area    : '9525067'
   
  },
  ukrane: {
    capital : 'Kiev',
    population  : '41130432 ',
    area    : '603500'
   
  }
};
  

for (const country in countries) {
  for (const property in countries[country]) {
    console.log(`${country},${property},${countries[country][property]}`)
  }
}

Note that for..in also iterates through key on the prototypes, so you should do extra checks to avoid this. Instead, I recommend using a for..of loop with Object.keys() or Object.entries():

const countries = {
  iran: {
    capital : 'Tehran',
    population  : '83183741',
    area    : '1648195'
   
  },
  uk: {
    capital : 'London',
    population  : '6708100',
    area    : '242495'
   
  },
  us: {
    capital : 'Washington D.C.',
    population  : '332641717',
    area    : '9525067'
   
  },
  ukrane: {
    capital : 'Kiev',
    population  : '41130432 ',
    area    : '603500'
   
  }
};
  

for (const country of Object.keys(countries)) {
  for (const property of Object.keys(countries[country])) {
    console.log(`${country},${property},${countries[country][property]}`)
  }
}

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

Comments

1

this can be the basic way:

//here we loop to get the countries
for (let country in countries) {
    // this will be the index (iran , uk , us , ukrane)
    
    //here we loop into the data of each country
    for(let data in countries[country]){
        //and we print the result easy as this:
        console.log(country + " , " + data + " , " +countries[country][data]);
    }

}

Comments

0

This would be another way, using Object.keys and a forEach.

const countries = {
  iran: {
    capital: 'Tehran',
    population: '83183741',
    area: '1648195'
  },
  uk: {
    capital: 'London',
    population: '6708100',
    area: '242495'
  },
  us: {
    capital: 'Washington D.C.',
    population: '332641717',
    area: '9525067'
  },
  ukrane: {
    capital: 'Kiev',
    population: '41130432 ',
    area: '603500'
  }
};

Object.keys(countries)
  .forEach(x =>
    console.log(`${x},${countries[x].capital},${countries[x].population},${countries[x].area}`)
  )

Comments

0

Maybe like this:

const countries = 
  { iran:    { capital: 'Tehran',          population: '83183741',  area: '1648195' } 
  , uk:      { capital: 'London',          population: '6708100',   area: '242495'  } 
  , us:      { capital: 'Washington D.C.', population: '332641717', area: '9525067' } 
  , ukraine: { capital: 'Kyiv',            population: '44983019',  area: '603500'  }  
  };

Object.keys(countries).forEach( cName =>
Object.entries(countries[cName]).forEach( ([k,v]) =>
  console.log( `${cName},${k},${v}`)
))
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

Comments

0

Using nested Object.entries

const countries = {
  iran: {
    capital: "Tehran",
    population: "83183741",
    area: "1648195",
  },
  uk: {
    capital: "London",
    population: "6708100",
    area: "242495",
  },
  us: {
    capital: "Washington D.C.",
    population: "332641717",
    area: "9525067",
  },
  ukraine: {
    capital: "Kyiv",
    population: "44983019",
    area: "603500",
  },
};

Object.entries(countries).forEach(([country, obj]) =>
  Object.entries(obj).forEach(([key, value]) =>
    console.log([country, key, value].join())
  )
);

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.