1

I am having some trouble with a JSON object I receive from my server. Using console.log on the JSON object correctly shows the JSON object I sent from the server, but when I try to iterate over the keys it starts acting strange. See below.

> console.log(promotions);
{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}

> for (p in promotions) { console.log(p); }
0
1
2
3
4
... (continues)
264
265
266
bold
strip
stripColors
trap
zalgo
zebra
rainbow
random
america
reset
dim
italic
underline
inverse
hidden
strikethrough
black
... (continues)
magentaBG
cyanBG
whiteBG

A few more details:

I am sending a request from a ExpressJS server using http.request to another ExpressJS server, which then returns the "promotion" JSON object. I have not been able to tell if it somehow gets corrupted underway (I might have set the encoding wrong?).

Testing using the same JSON object but hardcoded instead of sending it from the other server, gives the correct response.

Thanks!

5
  • What does console.dir(promotions) show you? Commented Apr 10, 2017 at 19:33
  • Also what is the context for the console.log() stuff in your question? Where do they appear in your code? Commented Apr 10, 2017 at 19:35
  • 1
    for ...in loops also include non-enumerable keys, and have no guaranteed order ? Commented Apr 10, 2017 at 19:36
  • console.dir(promotions) gives: '{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}' Commented Apr 10, 2017 at 19:41
  • 3
    Your JSON is still a string, you're seeing the properties that a typical string has, as well as the indices to each character. Commented Apr 10, 2017 at 19:44

2 Answers 2

4

Your promotions value is the string representation of the JSON. So when you do your for loop, it iterates through it as a string.

var promotions = '{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}';

for (var p in promotions) {
  console.log(p);
}

For why it does this, see this related question (although the truth is its just a weird consequence of the fact that strings are arrays behind the scenes in which case you should look at this answer)

If you do

var promotions = '{"promotion1":{"color":"white","backgroundColor":"red","text":"from promotion server"},"promotion2":{"color":"purple","backgroundColor":"yellow","text":"from promotion server2"},"promotion3":{"color":"green","backgroundColor":"black","text":"from promotion server3"}}';
  
// convert string representation of JSON into actual object
var promotionsObject = JSON.parse(promotions);

for (var p in promotionsObject) {
  console.log(p);
}

It should work as expected. Just keep in mind if you want to go through each object, and print the properties of those, you'll need to do extra work. See Printing nested JSON without using variable names

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

Comments

0

Try filtering out the properties that belongs to prototype

for (var p in promotions) {
  if (promotions.hasOwnProperty(p)) {
    console.log(p);
  }
}

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.