Javascript 访问JSON中的嵌套值,而不进行循环

Javascript 访问JSON中的嵌套值,而不进行循环,javascript,json,Javascript,Json,这是我的JSON,我想直接从JSON中获取zipCodes值,而无需在JSON中循环。我怎么做 countries:[ { name:'India', states:[{ name:'Orissa', cities:[{ name

这是我的JSON,我想直接从JSON中获取zipCodes值,而无需在JSON中循环。我怎么做

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

我想你在找我

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

请注意,这适用于上述JSON,因为countries数组中只有1个国家,与州和城市相同。但是,如果有多个国家、州或城市,则必须迭代以提取信息,直到知道确切的索引。

由于这不是关联数组,因此只能使用如下索引:

countries[x].states[y].cities[0].zipCodes
其中,
x
将是数组中的每个状态表示,当然,如果您有多个状态

类似地,
y
将是每个国家每个州的每个州,如果你有更多的州,如果你需要的话,你可以为城市做同样的事情

编辑: 下面是迭代数组的方法:

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;
             .....
         }
     }
}
您可以不断迭代,直到找到所需的国家、州和城市,然后从中提取
zipCodes
,如前一段代码所示。

无需“循环” 你可以做这个疯狂的把戏(并不是说这是最好的方法,但这样你就不会循环使用JSON):

如果您的数据已经是字符串,那么就不需要
JSON.stringify
。您看到的
forEach
实际上并不是通过JSON进行“循环”。它已经提取了邮政编码,而该编码只是将邮政编码添加到数组中。这一行:

var sv = JSON.stringify(data).match(new RegExp(name+'([\\S\\s]*?}][\\S\\s]*?}])'))[1].match(/zipCodes":\[(.*?)\]/g), r = [];
是什么抓住了邮政编码,它得到的东西像:

["zipCodes":["768019","768020"]"]
["768019", "768020"]
下一行:

item.match(/\d+/g)
将获取输出如下内容的数字:

["zipCodes":["768019","768020"]"]
["768019", "768020"]
循环只是将邮政编码添加到另一个数组中

带循环 最好通过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

性能和速度测试 测试后,复制一个阵列大约需要30秒。太多了。考虑到一个非常大的JSON大约为~5MB,循环通过略多于5MB的JSON大约需要0.14秒。永远不要担心速度。

这是我避免显式迭代的“诀窍”。让
JSON.parse
JSON.stringify
为您完成这项工作。如果JSON是字符串形式,请尝试以下操作:

var array = [];

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

    return value;
});

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

假设您的Json如下

所以现在我们使用地图,它会给你每个城市的ZipCode

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

      })
    })
})

若您使用return语句,那个么它将根据overjson为您提供2个带有两个邮政编码的数组

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)



你不能。除非您已经知道阵列中的位置。假设你刚刚展示了一个样本,并且你的真实数据有许多国家,每个国家都有许多州和城市?@vihan1086-是的,但是“古怪的把戏”真的不会比在其中循环更好,是吗?我的意思是,例如,你可以在(未解析的)JSON上使用正则表达式,但你为什么要这样做?@nnnnnn是的,所以有很多数据需要遍历,我想知道是否有任何有效的方法可以这样做。@vihan1086我需要用特定国家的所有Zipcode填充数组,所以循环并存储不是一个好的选择。@user1502144我已经添加了我的解决方案,告诉我这是否有效:)这只是一个示例数据,真正的JSON非常大,每个国家都有多个州、城市和Zipcode,我想得到特定国家的所有Zipcode。如上所述,然后,您必须迭代并检查每个值,直到找到要查找的内容。对于数组包含的每个项目,可以用整数替换X,如果countries[X]。name等于要搜索的国家的名称,则可以在每个步骤中进行检查,然后对州和城市执行相同的操作,直到达到所需的详细程度,并从中提取zipCodes。这有意义吗?我已经编辑了上面的答案,将迭代循环包括在内,这样您就可以在整个数组中找到所需的数据。@mmvsbg Unfiltered
,因为in
循环是危险的;)@vihan1086使用正则表达式提取JSON数据:)这只是一个样本数据,真正的JSON非常大,每个国家都有多个州、城市和Zipcode,我想得到一个特定国家的所有Zipcode。除非OP以字符串形式引用JSON,否则这是一个低效的答案<代码>JSON.stringify比“在JSON中循环”要昂贵得多。@PatrickRoberts我意识到这一点,我提到它可能不是很好,而且是一个“把戏”。问题是在不循环的情况下访问嵌套值,这正是我所做的。我的回答回答了这个问题,并且非常适合OP的情况,没有什么错。如果你只是在寻找一个低效的“技巧”,你可以从函数中获取值,这是JSON.stringify的第二个参数,如果键等于“zipCodes”,将该值推送到数组上。对于速度明显更快的循环,将
forEach
调用更改为实际值。这将返回一个数组,如:
[[“768019”,“768020”],[…]
@vihan1086将其展平