【问题标题】:How to iterate over json array in javascript如何在javascript中遍历json数组
【发布时间】:2014-01-13 10:23:40
【问题描述】:

是的,有很多关于这个的帖子。但我的怀疑有点不同。例如,我有以下数组

var dictionary = {
    "12Jan2013": [{
        "id": "0",
        "name": "ABC"
    }, {
        "id": "1",
        "name": "DEF"
    }],
    "13Jan2013": [{
        "id": "0",
        "name": "PQR"
    }, {
        "id": "1",
        "name": "xyz"
    }]
};

同一站点上有相同的帖子但在字典中 json 数组键是动态的。这是日期,即 12Jan2013。它可以是任何日期。它不是静态的。我已经搜索过为此,但没有得到解决方案。

如何迭代这样一个 json 数组?

AND 如何以上面显示的相同格式打印 json 数组?

编辑

这是我的真实代码。我在下面的代码中显示了一条评论,我想iterate 数据,即jsonData var in getWeatherDataForCities 回调

var arrAllrecords = [];
var arrCityrecordForADay = [];
function getWeatherDataForCities(cityArray, callback){

var toDaysTimestamp = Math.round((new Date()).getTime() / 1000) - (24*60*60);
for(var i in cityArray){

    for(var j=1; j<=1; j++){
        var jsonurl = "http://api.openweathermap.org/data/2.5/history/city?q="+cityArray[i]+"&dt="+toDaysTimestamp;

        $.ajax({
            url: jsonurl,
            dataType: "jsonp",
            mimeType: "textPlain",
            crossDomain: true,
            contentType: "application/json; charset=utf-8",
            success: function(data){                    
                var arrCityRecordForDay = [];
                /*arrCityrecordForADay.push(data.list[0].city.name);
                arrCityrecordForADay.push(data.list[0].weather[0].description);
                arrCityrecordForADay.push(timeConverter(data.list[0].dt));
                arrCityrecordForADay.push(data.list[0].main.temp);
                arrCityrecordForADay.push(data.list[0].main.humidity);
                arrCityrecordForADay.push(data.list[0].main.pressure)
                arrCityrecordForADay.push(data.list[0].wind.speed);*/
                //'{"pets":[{"name":"jack"},{"name":"john"},{"name":"joe"}]}';

                arrCityRecordForDay.push(
                    {"cityName" : data.list[0].city.name},
                    {"weather" : data.list[0].weather[0].description}
                );

                var tempId = data.list[0].city.name+"-"+timeConverter(data.list[0].dt);

                arrCityrecordForADay.push(
                    {tempId : arrCityRecordForDay}
                );

                if(((arrCityrecordForADay.length)) === cityArray.length) {
                    callback(arrCityrecordForADay);
                }

        } });
        toDaysTimestamp = toDaysTimestamp - (24*60*60);
    }   
}       
}

$(document ).ready(function() {

 var cityArray = new Array();
  cityArray[0] = "pune";

  getWeatherDataForCities(cityArray, function(jsonData) {
        // Here I want to iterate jsonData
  });


});

【问题讨论】:

  • 那不是 JSON 数组,那是 JS 数组对象。她们不一样。 JSON 是一种数据序列化格式。
  • 我不是重复的。这里有像数据这样的常量键是动态的。我很困惑是 json 还是 Benjamin 上面所说的数组

标签: javascript json iteration


【解决方案1】:

使用 for-in...类似:

for (var i in dictionary) {
    dictionary[i].forEach(function(elem, index) {
        console.log(elem, index);
    });
}

i 将遍历您的 dictionary 对象,然后您可以对字典中的每个 json 数组使用 forEach(使用 dictionary[i]

使用此代码,您将获得

Object {id: "0", name: "ABC"} 0 
Object {id: "1", name: "DEF"} 1 
Object {id: "0", name: "PQR"} 0 
Object {id: "1", name: "xyz"} 1 

您可以定制 forEach 函数定义(替换 console.log 位)以随心所欲地使用它。

DEMO

编辑:使用Object.keys 做同样的事情

Object.keys(dictionary).forEach(function(key) {
    dictionary[key].forEach(function(elem, index) {
        console.log(elem, index);
    });
});

Edit2:鉴于您的 jsonData 对象的结构有些复杂,您可以尝试使用(某种)通用函数,该函数将分别作用于每种类型的组件。我可能错过了一些案例,但可能是这样的:

function strung(arg) {
    var ret = '';
    if (arg instanceof Array) {
        arg.forEach(function(elem, index) {
            ret += strung(elem) + ',';
        });
    } else if (arg instanceof Object) {
        Object.keys(arg).forEach(function(key) {
            ret += key + ': /' + strung(arg[key]) + '/';
        });
    } else if (typeof arg === "string" || typeof arg === "number") {
        ret = arg;
    }
    return ret;
}

document.body.innerHTML = strung(jsonData);

DEMO

【讨论】:

  • 如果您使用的是forEach,您不妨使用Object.keys 并始终拥有漂亮的代码:)
  • 另请注意,您还需要使用hasOwnProperty(i) 过滤掉可能已继承的属性。
  • @BenjaminGruenbaum 我对Object.keys 不太满意……我已对我的答案进行了编辑。你是这个意思吗?
  • @PrashantShilimkar 我已将小提琴链接添加到我的答案中。看看
  • @PrashantShilimkar 乍一看,您的代码对我来说看起来不错(我假设 timeConverter 在其他地方定义)。让我补充一下,您不能直接将我的答案用于您的 jsonData 对象,因为它的结构略有不同。看到这个fiddle
【解决方案2】:

您可以使用for ... in,但您应该将它与hasOwnProperty 结合使用,否则您会发现自己迭代继承的属性可能会破坏您的代码。

  for (var key in object) {
    if (object.hasOwnProperty(key)) {
        // Do stuff.
    }
  }

【讨论】:

    【解决方案3】:

    请注意,您的只是一个 JavaScript 数组对象。为了使其易于理解,您可以像这样对其进行迭代:

    for (var i in dictionary) {
        // do something with i
        // here i will contain the dates
    
        for (n = 0; n < dictionary[i].length; n++) {
            // do something with the inner array of your objects    
            // dictionary[i][n].id contains the "id" of nth object in the object i
            // dictionary[i][n].name contains the "name" of nth object in the object i
        }
    }
    

    看这个小提琴:http://jsfiddle.net/Ke8F5/

    迭代看起来像这样:

    12Jan2013 : (id = 0, name = ABC) (id = 1, name = DEF)  
    13Jan2013 : (id = 0, name = PQR) (id = 1, name = XYZ)
    

    【讨论】:

    • 谢谢。我已经编辑了我创建动态 json 数组的问题。这是正确的方法还是我所做的正确?
    • @PrashantShilimkar:这完全取决于 data 在您的 ajax 调用中的结构。然而,这个概念保持不变。
    【解决方案4】:

    您可以使用 for 循环。

    for (var i in json) {
     ...
    }
    

    那么i就是当前key,那么,你就可以访问json[i]获取数据到对应的索引了。

    然后,如果你需要迭代内部元素,你可以做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2013-08-16
      • 2018-10-05
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多