Javascript 访问JSON中的嵌套值,而不进行循环
这是我的JSON,我想直接从JSON中获取zipCodes值,而无需在JSON中循环。我怎么做Javascript 访问JSON中的嵌套值,而不进行循环,javascript,json,Javascript,Json,这是我的JSON,我想直接从JSON中获取zipCodes值,而无需在JSON中循环。我怎么做 countries:[ { name:'India', states:[{ name:'Orissa', cities:[{ name
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将其展平