4

I observed a very weird phenomena in javascript and I can't figure out why. Consider this example below

state = "West Bengal"
city = "Kolkata"
country = "India"
some_json = {country: {"city": city, "state": state, "col_val": {}}}
console.log(some_json)

When I do a console.log() of some_json variable, I get this below

{ country: { city: 'Kolkata', state: 'West Bengal', col_val: {} } }

As you can see it replaced every other variable's values with the one defined above except country. Why is that?

When I perform the same operation in Python, it works just fine.

state = "West Bengal"
city = "Kolkata"
country = "India"
some_json = {country: {"city": city, "state": state, "col_val": {}}}

print(some_json)

Here doing a print gives me the expected outcome

{'India': {'state': 'West Bengal', 'col_val': {}, 'city': 'Kolkata'}}

So why is it giving different outcome in javascript? How can I fix this since I need to work with this exact format?

Jack Bashford
  • 43,180
  • 11
  • 50
  • 79
Souvik Ray
  • 2,899
  • 5
  • 38
  • 70
  • 1
    In neither case you're working with JSON. One is a JavaScript object, the other is a Python dictionary. As to why `country` is not replaced in the JavaScript one: because it's a key, not a value. – Robby Cornelissen Mar 07 '19 at 06:30

5 Answers5

3

When using a variable as key of an object in javascript use square bracket

let state = "West Bengal"
let city = "Kolkata"
let country = "India"
some_json = {
  [country]: {
    "city": city,
    "state": state,
    "col_val": {}
  }
}
console.log(some_json)
brk
  • 48,835
  • 10
  • 56
  • 78
3

You need to make country a dynamic property name with []:

var state = "West Bengal",
  city = "Kolkata",
  country = "India",
  some_json = {
    [country]: {
      "city": city,
      "state": state,
      "col_val": {}
    }
  };
console.log(some_json);

Also for the record it's not a JSON object - JSON would be storing it as a string. It's a plain and simple JavaScript object.

Jack Bashford
  • 43,180
  • 11
  • 50
  • 79
3

When you do {country: {"city": city, "state": state, "col_val": {}}} here the country doesnot refer to country variable. If you your key to dynamic use Computed property names

Similarly when you want to access the property value using country variable don't use some_josn.country use Bracket Notation like this some_josn[country]

let state = "West Bengal"
let city = "Kolkata"
let country = "India"
some_json = {[country]: {"city": city, "state": state, "col_val": {}}}
console.log(some_json)
console.log(some_json[country]) //accesing "Inida" from "some_json"
Maheer Ali
  • 35,834
  • 5
  • 42
  • 73
2

use it like this, and it will work

state = "West Bengal"
city = "Kolkata"
country = "India"
some_json = {}
some_json[country] = {"city": city, "state": state, "col_val": {}}
console.log(some_json)
Jaydeep Galani
  • 4,842
  • 3
  • 27
  • 47
2

As you said it's working in python, Python will consider it as dictionary not as JSON object.

In JavaScript, by default it replaces only value part of JSON with variable. It won't consider key to be replaced with variable value.

To force JavaScript to consider key and replace it with variable value, you have to tell to JavaScript explicitly by using []. Try below code:

state = "West Bengal"
    city = "Kolkata"
    country = "India"
    some_json = {[country]: {"city": city, "state": state, "col_val": {}}}
    console.log(some_json)
Deepak Kumar
  • 1,246
  • 14
  • 38