Javascript 如何使用这个JSON响应文件进行迭代

Javascript 如何使用这个JSON响应文件进行迭代,javascript,php,html,json,Javascript,Php,Html,Json,如上所述,我不知道如何使用服务器端php中的这种JSON响应,这是我通过使用以下代码echo JSON_encode(array_merge($outp,$outp2))得到的 如果我在客户端javascript中使用此代码 if (this.readyState == 4 && this.status == 200) { students = JSON.parse(this.responseText); students.forEach(function(ite

如上所述,我不知道如何使用服务器端php中的这种JSON响应,这是我通过使用以下代码
echo JSON_encode(array_merge($outp,$outp2))得到的

如果我在客户端javascript中使用此代码

if (this.readyState == 4 && this.status == 200) {
    students = JSON.parse(this.responseText);
    students.forEach(function(item){
    console.log(item.stuid);
    x = item.stuid;
    document.getElementById("demo").innerHTML += x + " " + item.stuname + "<br>" + item.cname + "<br>";
    });
}
不知何故,我可以迭代
stuid
stuame
,但它不允许它们将
cname
作为数组包含在一起

我怎样才能把它变成这样:-

12 Velino Meratis
InfoTech000, InfoTech001, C101
13 Alana Melker
CE000, CE001, C101

有人能帮忙解释一下吗?

您可以检查数组是否包含密钥,这样您就不会出现“未定义”错误

你可以这样做

if(item.hasOwnProperty('cname'))
{
console.log(item.cname);
}

您也可以将其用于stuname或其他键。

您需要通过唯一ID合并数组中的
student
对象。一种方法是将新的
stuid
s添加到数组中,并将其与具有相同
stuid
的后续项合并。一旦你有了一系列独特的学生,你就可以继续其他目标了

if (this.readyState == 4 && this.status == 200) {
    var students_raw = JSON.parse(this.responseText);
    var students = [];

    students_raw.forEach(function(item){
        var existing = students.find($item => item.stuid === $item.stuid);

        if (existing) {
            existing = Object.assign({}, existing, item);
        } else {
            students.push(item);
        }
    });

    // your print loop
    students.forEach(function(item) {
        var x = item.stuid;
        document.getElementById("demo").innerHTML += x + " " + item.stuname + "<br>" + item.cname + "<br>";
    });
}
if(this.readyState==4&&this.status==200){
var students_raw=JSON.parse(this.responseText);
var学生=[];
学生(功能(项目){
var existing=students.find($item=>item.stuid===$item.stuid);
如果(现有){
existing=Object.assign({},existing,item);
}否则{
学生。推(项);
}
});
//你的打印循环
students.forEach(功能(项目){
var x=item.stuid;
document.getElementById(“demo”).innerHTML+=x+“”+item.stuname+“
”+item.cname+“
”; }); }

请注意:和未得到广泛支持。您可能需要多填充这些方法

注意:此答案假设您愿意并且能够更改来自PHP的数据

值得称赞的是,这是@Magnus Eriksson评论的延伸

最好保持相关数据相互关联。对于格式良好的数据,您应该具有更好的灵活性。理想情况下,您应该在服务器端执行此操作,并将数据呈现给已格式化的客户端

您应该尝试并实现与以下类似的输出:

[{
    "stuid": "12",
    "stuname": "Velino Meratis",
    "stucourse": "BSIT",
    "stustat": "0",
    "stulyear": "4",
    "stulog": "feb 16 2017",
    "classes": [{
        "cname": "InfoTech000",
        "clog": "1"
    }, {
        "cname": "InfoTech001",
        "clog": "2"
    }, {
        "cname": "C101",
        "clog": "3"
    }]
}, {
    "stuid": "13",
    "stuname": "Alana Melker",
    "stucourse": "BSCE",
    "stustat": "1",
    "stulyear": "5",
    "stulog": "feb 16 2017",
    "classes": [{
        "cname": "CE000",
        "clog": "4"
    }, {
        "cname": "CE001",
        "clog": "5"
    }, {
        "cname": "C101",
        "clog": "6"
    }]
}];
注意我使用了类作为属性名称,因为我们似乎正在处理课程及其类

您的javascript现在看起来像:

if (this.readyState == 4 && this.status == 200) {
    students = JSON.parse(this.responseText);
    students.forEach(function(item){
    console.log(item.stuid);
    x = item.stuid;
    document.getElementById("demo").innerHTML += x + " " + item.stuname + "<br>" + item.classes.map(function(elem){
return elem.cname;}).join(",") + "<br>";
    });
}

您也可以这样尝试一次

HTML

<div id="result"></div>

脚本

var dataJSON = [
{
    "stuid":"12",
    "stuname":"Velino Meratis",
    "stucourse":"BSIT",
    "stustat":"0",
    "stulyear":"4",
    "stulog":"feb 16 2017"
},
{
    "stuid":"13",
    "stuname":"Alana Melker",
    "stucourse":"BSCE",
    "stustat":"1",
    "stulyear":"5",
    "stulog":"feb 16 2017"
},
{
    "stuid":"12",
    "cname":"InfoTech000",
    "clog":"1"
},
{
    "stuid":"12",
    "cname":"InfoTech001",
    "clog":"2"
},
{
    "stuid":"12",
    "cname":"C101",
    "clog":"3"
},
{
    "stuid":"13",
    "cname":"CE000",
    "clog":"4"
},
{
    "stuid":"13",
    "cname":"CE001",
    "clog":"5"
},
{
    "stuid":"13",
    "cname":"C101",
    "clog":"6"
}
]   ;
 var arr = {};
 for(var i = 0 ; i< dataJSON.length ; i++){
    var ele = dataJSON[i];
    if(arr[ ele.stuid ]==undefined){
        arr[ ele.stuid ] = {}; 
    }
    arr[ ele.stuid ]['stuid'] = ele.stuid;
    if(ele.stuname!=undefined){
       arr[ ele.stuid ]['stuname'] = ele.stuname;
    }
    if(arr[ ele.stuid ]['cname'] == undefined){
       arr[ ele.stuid ]['cname'] = [];
    }
    if(ele.cname!=undefined){
       arr[ ele.stuid ]['cname'].push(ele.cname);
    }
 }
 var str = '';
 for(var key in arr){
    var obj = arr[key];
    str += obj['stuid'] +" "+obj['stuname']+'<br/>';
    str += obj['cname'].toString()+'<br/>';
 }
 document.getElementById("result").innerHTML = str;
var-dataJSON=[
{
“stuid”:“12”,
“stuname”:“Velino Meratis”,
“stucourse”:“BSIT”,
“stustat”:“0”,
“stulyear”:“4”,
“stulog”:“2017年2月16日”
},
{
“stuid”:“13”,
“绝技”:“Alana Melker”,
“stucourse”:“理学学士”,
“stustat”:“1”,
“stulyear”:“5”,
“stulog”:“2017年2月16日”
},
{
“stuid”:“12”,
“cname”:“InfoTech000”,
“阻塞”:“1”
},
{
“stuid”:“12”,
“cname”:“InfoTech001”,
“阻塞”:“2”
},
{
“stuid”:“12”,
“cname”:“C101”,
“阻塞”:“3”
},
{
“stuid”:“13”,
“cname”:“CE000”,
“阻塞”:“4”
},
{
“stuid”:“13”,
“cname”:“CE001”,
“阻塞”:“5”
},
{
“stuid”:“13”,
“cname”:“C101”,
“阻塞”:“6”
}
]   ;
var arr={};
for(var i=0;i;
str+=obj['cname'].toString()+'
'; } document.getElementById(“结果”).innerHTML=str;

谢谢,

如您所见,所有项目都没有您尝试使用的所有参数。是
stuid
不够还是什么?您尝试在数组中的每个对象上使用
cname
stuame
。如果您查看json数据,所有对象都没有这两个属性(实际上没有一个对象同时具有这两个属性),因此当它们不存在时,尝试使用它们会给您带来“未定义”的结果。json从何而来?如果您是自己创建的,我建议您使用更好的数据结构。我是说,你应该为每个学生构建一个对象,包含所有连接到该学生的数据。如果属性可以有多个值,请将其设置为具有这些值的数组。还要确保所有学生对象都具有相同的属性集。对不起,杜德,但它仅限于具有
stuname
的前两个对象,否则它会被证明是未定义的:/对“stuname”也使用相同的解决方案。
<div id="result"></div>
var dataJSON = [
{
    "stuid":"12",
    "stuname":"Velino Meratis",
    "stucourse":"BSIT",
    "stustat":"0",
    "stulyear":"4",
    "stulog":"feb 16 2017"
},
{
    "stuid":"13",
    "stuname":"Alana Melker",
    "stucourse":"BSCE",
    "stustat":"1",
    "stulyear":"5",
    "stulog":"feb 16 2017"
},
{
    "stuid":"12",
    "cname":"InfoTech000",
    "clog":"1"
},
{
    "stuid":"12",
    "cname":"InfoTech001",
    "clog":"2"
},
{
    "stuid":"12",
    "cname":"C101",
    "clog":"3"
},
{
    "stuid":"13",
    "cname":"CE000",
    "clog":"4"
},
{
    "stuid":"13",
    "cname":"CE001",
    "clog":"5"
},
{
    "stuid":"13",
    "cname":"C101",
    "clog":"6"
}
]   ;
 var arr = {};
 for(var i = 0 ; i< dataJSON.length ; i++){
    var ele = dataJSON[i];
    if(arr[ ele.stuid ]==undefined){
        arr[ ele.stuid ] = {}; 
    }
    arr[ ele.stuid ]['stuid'] = ele.stuid;
    if(ele.stuname!=undefined){
       arr[ ele.stuid ]['stuname'] = ele.stuname;
    }
    if(arr[ ele.stuid ]['cname'] == undefined){
       arr[ ele.stuid ]['cname'] = [];
    }
    if(ele.cname!=undefined){
       arr[ ele.stuid ]['cname'].push(ele.cname);
    }
 }
 var str = '';
 for(var key in arr){
    var obj = arr[key];
    str += obj['stuid'] +" "+obj['stuname']+'<br/>';
    str += obj['cname'].toString()+'<br/>';
 }
 document.getElementById("result").innerHTML = str;