遍历JSON对象

6

I have the following JSON file:

{"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循环就足够了。 - Chad
Schnitzl gnam var sting='("'+Object.keys(json).join('","')+'")' 如果你没有原型。 - cocco
4个回答

7

不需要使用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
@Orlando,你不必使用hasOwnProperty,除非库与对象原型有冲突(如果有,你应该意识到它),你才需要使用hasOwnProperty。自2010年以来,如果有人搞乱了对象原型,他们应该使用Object.defineProperty并标记为enumerable: false - Chad
是的,你说得对,在这里你不必使用它,但始终使用它是一种好习惯。问题是当你遍历继承自其他对象的对象时。 - Orlando
@Orlando 我不同意,你应该理解何时应该使用它,并适当地使用它。我认为即使不需要它,也不应该将它扔进每个循环中,这并不是最佳实践。 - Chad
@chad 两件事情.. 1. 这是一个好的实践,如果你不想使用它也没关系.. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in),如果你使用 jslint 它会报告缺少检查自有属性的 if 语句。 - Orlando
@Orlando,你说“总是使用它是一个好习惯”,我不同意,你应该在适当的时候使用它。就像你的MDN链接所说:“如果你只想考虑附加到对象本身而不是其原型的属性”,这是你会使用它的情况。 - Chad

3

首先使用 JSON 解析它

var json = JSON.parse(jsonString)

然后它就是一个 JavaScript 对象,您应该使用它..

Object.keys(json).forEach(function (key) {
    json[key];  
});

如果您使用for in,则需要检查对象是否具有该属性并且不是其父对象之一(if (json.hasOwnProperty) { //code here })。而使用Object.keys,您无需这样做,因为它仅获取对象自己拥有的键。

根据所需的浏览器支持情况,这可能是危险的。 - Chad
@chad,它兼容ie9+,并且两个函数都有polyfills。 - Orlando
为什么要循环?变量days = Object.keys(json) - cocco
@cocco 如果你想要访问这些值,你需要循环。 - Orlando
他认为他需要字符串...没错。 - cocco

1
var mensaplan = json['Mensaplan'];
for (key in mensaplan) {
     values = mensaplan[key];
     //do something with the values
}

0

这里不需要使用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]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接