admin管理员组

文章数量:1420120

This is my JSON, I want to directly get the zipCodes values from the JSON without looping through the JSON. How can I do it?

countries:[
             {
               name:'India',
               states:[{
                           name:'Orissa',
                           cities:[{
                                      name:'Sambalpur',
                                      zipCodes:{'768019','768020'}
                                  }]
                      }]
             }
             ]

This is my JSON, I want to directly get the zipCodes values from the JSON without looping through the JSON. How can I do it?

countries:[
             {
               name:'India',
               states:[{
                           name:'Orissa',
                           cities:[{
                                      name:'Sambalpur',
                                      zipCodes:{'768019','768020'}
                                  }]
                      }]
             }
             ]
Share Improve this question edited Jun 20, 2015 at 8:26 mmvsbg 3,58817 gold badges54 silver badges74 bronze badges asked Jun 20, 2015 at 8:18 user1502144user1502144 491 silver badge5 bronze badges 12
  • You can't. Unless you already know the position within the arrays. Assuming you've just shown a sample and your real data has many countries, each with many states and cities? – nnnnnn Commented Jun 20, 2015 at 8:20
  • @vihan1086 - Well yes, but the "funky tricks" really aren't going to be any better than looping through it, are they? I mean, you could for example use a regex on the (unparsed) JSON, but why would you? – nnnnnn Commented Jun 20, 2015 at 8:30
  • @nnnnnn yes , so there is a lot of data to traverse , I wanted to know if there is any efficient way to do it . – user1502144 Commented Jun 20, 2015 at 8:30
  • @vihan1086 i need to populate an array with all zipCodes of a particular country , so looping through it and storing is not a good option . – user1502144 Commented Jun 20, 2015 at 8:40
  • @user1502144 I've added my solution, tell me if that works :) – Downgoat Commented Jun 20, 2015 at 8:56
 |  Show 7 more ments

5 Answers 5

Reset to default 1

I think you are looking for

countries[0].states[0].cities[0].zipCodes

Please note, this works for the above JSON as there is only 1 country in countries array and same as for states and cities. However, if there are more than 1 country, state or city then, you will have to iterate to extract information until and unless you know the exact index.

As this is not an associative array, your option is only to use indexes like this:

countries[x].states[y].cities[0].zipCodes

Where x would be each representation of state in your array, in case, of course, that you have more than one.

Similarly y would be each state in each state in each country, in case you have more of those and you can do the same for cities if you need to.

EDIT: Here's how you can iterate the array:

for(var c in countries)
{
     var name = countries[c].name;
     if (name === "CountryIAmLookingFor")
     {
         var statesList = countries[c].states;
         for (var s in statesList)
         {
             var stateName = statesList[s].name;
             .....
         }
     }
}

You can keep iterating until you find the country, state, and city you need, then extract the zipCodes from there as shown in the previous code snippet.

Without "looping"

You can do this crazy trick (not saying this is the best way, but this way you aren't looping through the JSON):

var myData = { 'Put Your Data': 'HERE' };
function getCodes(name, data) {
    var sv = data.match(new RegExp(name+'([\\S\\s]*?}][\\S\\s]*?}])'))[1].match(/zipCodes":\[(.*?)\]/g), r = [];
    sv.forEach(function (item) {
        item.match(/\d+/g).forEach(function (sub) {
            r.push(+sub);
        });
    });
    return r;
}
getCodes('India', JSON.stringify(myData));

If your data is already string, then you don't need the JSON.stringify. The forEach you see isn't actually "looping" through the JSON. It's already extracted the zip codes and the code just adds the zip codes to the array. . This line:

var sv = JSON.stringify(data).match(new RegExp(name+'([\\S\\s]*?}][\\S\\s]*?}])'))[1].match(/zipCodes":\[(.*?)\]/g), r = [];

is what grabs the zip codes, it gets something like:

["zipCodes":["768019","768020"]"]

The next line:

item.match(/\d+/g)

will grab the numbers outputting something like:

["768019", "768020"]

The loop just adds the zip-codes to another array

With looping

You're better off looping through the JSON:

var myData = {}, // Your data
    zips   = [];

myData.countries.forEach(function(i) {
    if (i.name === 'India') {
        i.states.forEach(function(j) {
            j.cities.forEach(function(l) {
                l.zipCodes.forEach(function(m) {
                    zips.push(m);
                });
            });
        });
    }
});

//use "zips" array

PERFORMANCE AND SPEED TESTS

After testing copying an array about 500MB (half a gig) took about 30 seconds. That's a lot. Considering an extremely large JSON would be about ~5MB, looping through a little over 5MB of JSON takes about 0.14 seconds. You should never worry about speed.

Here's my "trick" for avoiding explicit iteration. Let JSON.parse or JSON.stringify do the work for you. If your JSON is in string form, try this:

var array = [];

JSON.parse(jsonString, function (key, value) {
    if (key === "zipCodes") {
        array = array.concat(value);
    }

    return value;
});

console.log(array); // all your zipCodes

Suppose your Json is like

countries =[
             {
               name:'India',
               states:[{
                           name:'Orissa',
                           cities:[{
                                      name:'Sambalpur',
                                      zipCodes:768019768020
                                  }]
                      },{
                           name:'mumbai',
                           cities:[{
                                      name:'rea',
                                      zipCodes:324243
                                  }]
                      }]
             }
      ]

So now we use MAP it will give you ZipCode of every cities

countries.map(function(s){
   s.states.map(function(c){
      c.cities.map(function(z){
         console.log(z.zipCodes)

      })
    })
})

OR

If you use return statement then it will give you 2 array with two zip code as per over JSON

var finalOP = countries.map(function(s){
   var Stalist = s.states.map(function(c){
      var zip = c.cities.map(function(z){

         return z.zipCodes
      })
      return zip
    })
     return Stalist 
})

console.log(finalOP)

本文标签: javascriptAccess the nested value in JSON without looping through itStack Overflow