How to build JSON with a list of stores separated by categories?

Asked

Viewed 929 times

2

I do not have much intimacy with JSON and I need to create a structure that contains a list of stores separated by categories, where each store item has some information (name, floor, phone etc.) I even thought of making a JSON for each category, but I’d like it to be all in one object so I can iterate.

I tried something like below but it’s not working out so well:

var ljs = {
   "categ": "Loja de Departamentos",
   "lojas": [
      {
        nome: "LOJA A",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_a.jpg"
      },
      {
        nome: "LOJA B",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_b.jpg"
      }
      ]
};

Besides "categ": "Loja de Departamentos" will also have several other categories such as Confectioneries, Restaurants etc. I believe the key "lojas" be even unnecessary.

How can I set up such a JSON, where it lists the categories and the list of stores for each one and then I can pull the data with a for?

  • Are there stores that are in more than one category ? If this is the case it is easier to reverse and make an array of stores in which each store has an array of categories.

  • No, only in 1 category.

3 answers

4

A simple way would be like this:

var ljs = [
  {
    "categ": "Categ1",
    "lojas": [
      {
        nome: "LOJA A",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_a.jpg"
      },
      {
        nome: "LOJA B",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_b.jpg"
      }
    ]
  },
  {
    "categ": "Categ2",
    "lojas": [
      {
        nome: "LOJA C",
        piso: "3",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_c.jpg"
      }
    ]
  }
];

for(i in ljs) {
  let lj = ljs[i]
  
  console.log(lj.categ, lj.lojas)
}

2

Just pack the data of the categories into a root array. You can give a name for the field that will hold the root (in the example I used dados), or as was suggested in the other answer, transform ljs in an array itself.

Thus:

var ljs = {
    "dados": [
        {
           "categ": "Loja de Departamentos",
           "lojas": [
              {
                nome: "LOJA A",
                piso: "1",
                tel: "",
                desc: "descrição da loja.",
                imagem: "logo_a.jpg"
              },
              {
                nome: "LOJA B",
                piso: "1",
                tel: "",
                desc: "descrição da loja.",
                imagem: "logo_b.jpg"
              }
            ]
        },
        {
           "categ": "XYZ",
           "lojas": [
              {
                nome: "LOJA X",
                piso: "3",
                tel: "",
                desc: "descrição da loja.",
                imagem: "logo_x.jpg"
              },
              {
                nome: "LOJA Y",
                piso: "2",
                tel: "",
                desc: "descrição da loja.",
                imagem: "logo_y.jpg"
              }
            ]
        },
        ...
    ]
};

2


You can also use the category name as key:

var ljs = {
  "Categ 1": {
    "lojas": [
      {
        nome: "LOJA A",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_a.jpg"
      },
      {
        nome: "LOJA B",
        piso: "1",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_b.jpg"
      }
    ]
  },
  "Categ 2": {
    "lojas": [
      {
        nome: "LOJA C",
        piso: "3",
        tel: "",
        desc: "descrição da loja.",
        imagem: "logo_c.jpg"
      }
    ]
  }
};

for(cat in ljs) {
  let lj = ljs[cat]
  console.log("Nome da categoria:", cat)
  console.log("Lojas:", lj.lojas)
}

NOTE: I confess that I do not think it is cool to put accented words as key.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.