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