JSON数组只给出" 1"作为长度,不能循环

时间:2015-04-20 15:13:22

标签: javascript jquery arrays json

我有以下json数组:

var champions = [{
  "1":{
    "name":"Aatrox",
    "role1":"Top",
    "role2":"Jungle"},
  "2":{
    "name":"Ahri",
    "role1":"Middle"},
  "3":{"
    name":"Akali",
    "role1":"Middle",
    "role2":"Top"
   }
}];

我尝试使用我发现的代码片段遍历此数组:

$(document).ready(function(){
    var x = 1;
    for(var i = 0; i < champions.length; i++) {
        console.log(champions[i][x].name);
        x++;
    }
});

但它只给了我&#34; Aatrox&#34;并且当champions.length为1时停止 如何在数组中循环显示所有名称?

5 个答案:

答案 0 :(得分:5)

假设您不希望更改数据结构,可以迭代数组,然后迭代其中每个对象的属性(然后访问名称):

var champions = [{
  "1":{
    "name":"Aatrox",
    "role1":"Top",
    "role2":"Jungle"},
  "2":{
    "name":"Ahri",
    "role1":"Middle"},
  "3":{
      "name":"Akali",
    "role1":"Middle",
    "role2":"Top"
   }
}];

$(document).ready(function(){
    for(var i = 0; i < champions.length; i++) {
        for (var prop in champions[i]){
            console.log(champions[i][prop].name);
        }
    }
});

JSFiddle: http://jsfiddle.net/TrueBlueAussie/234yspw1/

注意:返回的顺序是未定义的,因此您不应指望它。

JSFiddle: http://jsfiddle.net/TrueBlueAussie/234yspw1/1/

如果订单 重要,则需要将数据重组为数组。

答案 1 :(得分:3)

编辑:工作JS小提琴:https://jsfiddle.net/3ms8s9jr/

var champions = [{
  "1":{
    "name":"Aatrox",
    "role1":"Top",
    "role2":"Jungle"},
  "2":{
    "name":"Ahri",
    "role1":"Middle"},
  "3":{"
    name":"Akali",
    "role1":"Middle",
    "role2":"Top"
   }
}];

需要:

var champions = [
  {
    "name":"Aatrox",
    "role1":"Top",
    "role2":"Jungle"
  },
  {
    "name":"Ahri",
    "role1":"Middle"
  },
  { 
    "name":"Akali",
    "role1":"Middle",
    "role2":"Top"
  }
];

你需要为每个冠军拥有一个对象,现在你将它们全部存储在一个大对象中,这样你就不能轻易地遍历它(相反,它实际上很难做到这一点)

理想情况下,您希望以易于使用的格式获取数据,因此,如果需要将数据转换为数组,则可能是最佳的长期选项。

像这样循环:

$(document).ready(function(){
    for(var i = 0; i < champions.length; i++) {
        console.log(champions[i].name);
    }
});

答案 2 :(得分:3)

注意:正如大家所指出的,你的数据结构有点奇怪。最好的想法是确保您的数组结构正确,以便您可以将其作为数组进行迭代,但您也可以迭代包含单个对象的数组:

jQuery&#39; s each在迭代对象方面做得很好。键:

if(champions.length) {
    $.each(champions[0], function(key, value) {
        console.log(value.name);
    });
}

jsFiddle

答案 3 :(得分:2)

这是一个长度为一的数组。像这样迭代对象:

var champs = champions[0]
var keys = Object.keys(champs)

// if you need them in order
keys = keys.map(Number).sort().map(String)

// iterate
keys.forEach(function (key, index) {
   console.log(key)           // "1"
   console.log(champs[key])   // { "name": "etc" }
})

答案 4 :(得分:1)

如果你想循环这个数组

var champions = [{
  "1":{
    "name":"Aatrox",
    "role1":"Top",
    "role2":"Jungle"},
  "2":{
    "name":"Ahri",
    "role1":"Middle"},
  "3":{"
    name":"Akali",
    "role1":"Middle",
    "role2":"Top"
   }
}];

您的代码需要看起来像这样

for( var i = 0, end = champions.length; i < end; i++ ){
  for( var attr in champions[i] ){
    if( !champions[i].hasOwnProperty( attr ) ){
      continue
    }
    // champions[i][attr] is the champion here
  }

Alternateley,您可以使用看起来相当奇怪的代码将奇怪的json转换为常规数组。

var championsArray = Array.prototype.splice.call( champions[0] )

然后正常循环。