Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON数组只给出;1“;作为长度,不能循环通过_Javascript_Jquery_Arrays_Json - Fatal编程技术网

Javascript JSON数组只给出;1“;作为长度,不能循环通过

Javascript JSON数组只给出;1“;作为长度,不能循环通过,javascript,jquery,arrays,json,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" } }]; 我试图用我找到的代码片段循环遍历这个数组

我有以下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++;
    }
});
$(文档).ready(函数(){
var x=1;
对于(变量i=0;i<0.length;i++){
console.log(champions[i][x].name);
x++;
}
});
但它只给了我“Aatrox”并停止为
冠军。长度
为1。

如何在数组中循环查找所有名称?

编辑:工作JS FIDLE:

var=[{
"1":{
“名称”:“Aatrox”,
“角色1”:“顶级”,
“角色2”:“丛林”},
"2":{
“姓名”:“Ahri”,
“角色1”:“中间”},
"3":{"
名称“:“阿卡利”,
“角色1”:“中间”,
“角色2”:“顶级”
}
}];
需要:

var=[
{
“名称”:“Aatrox”,
“角色1”:“顶级”,
“角色2”:“丛林”
},
{
“姓名”:“Ahri”,
“角色1”:“中间”
},
{ 
“名称”:“阿卡利”,
“角色1”:“中间”,
“角色2”:“顶级”
}
];
你需要每个冠军有一个对象,现在你把它们都存储在一个大对象中,所以你不能轻易地循环通过它(更确切地说,有效地进行循环是很尴尬的)

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

像这样循环:

$(document).ready(function(){
    for(var i = 0; i < champions.length; i++) {
        console.log(champions[i].name);
    }
});
$(文档).ready(函数(){
对于(变量i=0;i<0.length;i++){
console.log(champions[i].name);
}
});
注意:正如大家所指出的,您的数据结构有点奇怪。最好的方法是确保数组的结构正确,以便可以将其作为数组进行迭代,但也可以迭代包含单个对象的数组:

jQuery在迭代对象和键方面做得很好:

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

如果要循环此阵列

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
  }

然后正常循环。

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

var=[{
"1":{
“名称”:“Aatrox”,
“角色1”:“顶级”,
“角色2”:“丛林”},
"2":{
“姓名”:“Ahri”,
“角色1”:“中间”},
"3":{
“名称”:“阿卡利”,
“角色1”:“中间”,
“角色2”:“顶级”
}
}];
$(文档).ready(函数(){
对于(变量i=0;i<0.length;i++){
对于(冠军中的var道具[i]){
console.log(champions[i][prop].name);
}
}
});
JSFiddle:

注意:它们返回的顺序是未定义的,因此您不应该依赖于此

JSFiddle:


如果顺序很重要,您需要将数据重组为一个数组。

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

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" }
})

因为数组只包含一个object,所以它不仅仅是一个数组。它是一个具有各种编号属性的单元素数组(在该单元素上)。console.log(champions[0][i].name);会有用的。第一个深度是数组。你在一个只有一个元素的数组中循环,而这个元素实际上包含三个元素。那么,正确的循环方式是什么<代码>控制台.log(冠军[0][i].name)不起作用。我不知道
看起来像什么,当然你可以迭代一个对象的属性。只是不是外部阵列。您不需要更改数据以匹配代码。数据结构很糟糕,您的所有数据都是这种格式吗?如果是这样,只需从对象中取出数据并将其推送到一个数组。“
for(冠军中的var i)
”最好避免使用
for in
在数组中循环(没有安全措施);这不是它的目的。(虽然内部循环很好。)@T.J.Crowder我最近在for中遇到了问题,想知道它的正确用法是什么?我从来没有真正弄清楚问题是什么。。。我只是换了一个for循环,一切正常@谢谢你@本贾明保罗::-)
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);
        }
    }
});
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" }
})