【问题标题】:Iterating over a JSON-Object [duplicate]遍历 JSON 对象 [重复]
【发布时间】: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('","')+'")'有原型。

标签: javascript json


【解决方案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]);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多