遍历 JSON 对象 [重复]
Posted
技术标签:
【中文标题】遍历 JSON 对象 [重复]【英文标题】:Iterating over a JSON-Object [duplicate] 【发布时间】:2013-08-25 11:17:54 【问题描述】:我有以下 JSON 文件:
"Mensaplan": [
"Montag": [
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": true, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false
],
"Dienstag": [
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": true,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false
],
"Mittwoch": [
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": true, "bio": false,
"food": "Schnitzl", "price": "4.00 €", "vegetarian": false, "bio": true
],
"Donnerstag": [
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false
],
"Freitag": [
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false,
"food": "Schnitzl", "price": "5.00 €", "vegetarian": false, "bio": false
]
]
我想遍历“Mensaplan”并获得每一天(“Montag”、“Dienstag”、[...](它是德语))。我试图用 jQuery 方法 $.each 来做到这一点,但我不知道如何为这些日子制定通配符,因为每个通配符都有不同的名称。
谁能帮我解决这个问题?
提前致谢!
【问题讨论】:
这里不需要 jQuery,一个普通的 for 和/或 for-in 循环就足够了。 Schnitzl gnam var sting='("'+Object.keys(json).join('","')+'")'有原型。 【参考方案1】:不需要 jQuery,一个简单的for...in 循环就可以了。
var obj = JSON.parse(yourJsonString);
//for each object in the "Mensaplan" array
for(var i = 0; i < obj.Mensaplan.length; ++i)
//for each key in the object
for(var key in obj.Mensaplan[i])
var day = obj.Mensaplan[i][key];
//here key is the day's name, and day is the data...
希望这会有所帮助。
【讨论】:
这里需要使用hasOwnProperty
。
@Orlando 你不需要需要使用hasOwnProperty
,只有当一个库与对象原型混淆(如果他们这样做你应该知道它)你会需要使用hasOwnProperty
。自 2010 年以来,如果有人在弄乱 Object 原型,他们应该使用 Object.defineProperty
并标记为 enumerable: false
。
你是对的,你不必在这里使用它,但总是使用它是一个好习惯,问题是当你迭代从其他人继承的对象时
@Orlando 我不同意,你应该明白什么时候应该使用它,并适当地使用它。我不认为最好的做法是把它扔到每个循环中,即使它不需要在那里。
@chad 2 件事.. 1. 这是一个很好的做法,如果你不想使用它也没关系.. (developer.mozilla.org/en-US/docs/Web/javascript/Reference/…),如果你使用 jslint,它会报告一个 if缺少检查自己的属性。【参考方案2】:
首先使用JSON
解析它
var json = JSON.parse(jsonString)
then 只是一个 javascript 对象.. 你应该使用..
Object.keys(json).forEach(function (key)
json[key];
);
如果您使用for in
,您需要检查该对象是否具有该属性并且不是其父对象之一 (if (json.hasOwnProperty) //code here
)
使用 Object.keys 你不需要这样做,因为只获取对象拥有的键。
【讨论】:
取决于所需的浏览器支持,这可能很危险。 @chad.. 它的 ie9+ 兼容,并且两个函数都有 polyfills。 为什么要循环? var days=Object.keys(json) @cocco 如果你想访问你需要循环的值.. 认为他需要字符串...对。【参考方案3】:var mensaplan = json['Mensaplan'];
for (key in mensaplan)
values = mensaplan[key];
//do something with the values
【讨论】:
【参考方案4】:这里不需要jquery,一个简单的for in就足够了,但是你必须检查hasOwnProperty函数,因为for in循环也可以检索对象的方法。
for (var key in Mensaplan)
if (Mensaplan.hasOwnProperty(key)
console.log(Mensaplan[key]);
更新:在你的情况下 Mensaplan 是一个包含在 json 中的数组...对于数组,最快的方法是标准 for 循环,而不是 for in
for (var i = 0, length = Mensaplan.length; i < length; i++)
console.log(Mensaplan[i]);
【讨论】:
以上是关于遍历 JSON 对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用打字稿(Angular2)循环遍历JSON对象[重复]
访问 JSON 数组中的对象 (JavaScript) [重复]