Javascript 排序后Jquery对象未定义,但在firebug中
我对返回数据的脚本执行ajax调用。我在firebug中看到了数据,它是正确的。当数据返回时,我会进行排序,它也会起作用。我在firebug中看到对象按我想要的方式排序。排序之后,我尝试访问一个键/值对。我在firebug中看到我想要的键/值在对象中。当我尝试使用对象键/值分配给变量时,它是未定义的。我正在尝试聚合重复数据。如果我没有用最好的方法去做,请用更好的方法来帮助我 数据样本Javascript 排序后Jquery对象未定义,但在firebug中,javascript,jquery,ajax,object,Javascript,Jquery,Ajax,Object,我对返回数据的脚本执行ajax调用。我在firebug中看到了数据,它是正确的。当数据返回时,我会进行排序,它也会起作用。我在firebug中看到对象按我想要的方式排序。排序之后,我尝试访问一个键/值对。我在firebug中看到我想要的键/值在对象中。当我尝试使用对象键/值分配给变量时,它是未定义的。我正在尝试聚合重复数据。如果我没有用最好的方法去做,请用更好的方法来帮助我 数据样本 coreDate“060115” 芯型“星号11” 文件名“/var/www/html/Cores/gdb.ha
coreDate“060115”
芯型“星号11”
文件名“/var/www/html/Cores/gdb.hamid.asterisk.060115”
jid“哈米德”
代码
$。什么时候(
$.ajax({
键入:“获取”,
url:'cf.php',
数据类型:“json”,
超时:120000,
})
)
.done(功能(coreInfo){
sort(函数(a,b){返回a.coreType>b.coreType});
var corests={};
coreStats.numofores=0;
corests.numOfCoreType=0;
coreStats.prevCoreType=coreInfo.coreType;
//由于某些原因,没有定义coreInfo.coreType。coreInfo对象存在,coreType在那里。我尝试了这个.coreType,但没有定义。
$.each(coreInfo,function(){
numOfCores++;
if(corests.prevCoreType!=此.coreType){
//这很有效。为什么我必须访问This.coreType而不是coreInfo.coreType?
$('#list>tbody:last child').append('+this.coreType+'+coreStats.numOfCoreType+'
corejid');
corests.numOfCoreType=0;
}
numOfCoreType++;
coreStats.prevCoreType=this.coreType;
//在这里设置prevCoreType很有效
});
$('#cores').html(“+corests.numocores+”
Core文件);
})
.fail(函数(){
});
根据您的代码和描述,听起来好像coreInfo
是一个对象数组,对吗?如果它是一个对象,它就不会有sort()
方法,您的代码就停在那里
如果它是一个数组,它没有类似于coreInfo.coreType
的属性。数组的每个元素都是一个具有coreType
和其他属性的对象。这就是为什么您可以在$.each()
回调中访问this.coreType
$。each()
逐个元素迭代数组,并将每个元素传递到回调中
在Firebug中,$之外的coreInfo.coreType
。each()
,我怀疑您实际看到的是coreInfo[0]。coreType
,即数组的第一个元素
为了帮助跟踪变量是否是数组,我强烈建议给数组命名,以反映这一事实:要么用复数,要么在名称中添加List
或array
,或者其他什么。像coreInfo
这样的名称听起来像一个单数项。我会调用数组coreList
,coreArray
,或者干脆调用cores
。就个人而言,为了简洁起见,我喜欢复数:cores
表示核心信息数组,core
表示该数组中的单个元素
这样,当您看到cores.coreType
或coreList.coreType
或coreraray.coreType
时,它看起来会出错
顺便说一句,对于可读性更高的代码,我建议不要在$.each()
回调中使用this
。相反,请使用命名参数
$.each( coreInfo, function( i, core ) {
coreStats.numOfCores++;
if( coreStats.prevCoreType != core.coreType ) {
$('#list > tbody:last-child').append(
'<tr>' +
'<td>' +
'<a href="' + core.fileName + '">' +
core.coreType +
'</a>' + // MISSING IN ORIGINAL
'</td>' +
'<td>' +
coreStats.numOfCoreType +
'<br>core' +
'</td>' +
'<td>' +
'jid' +
'</td>' +
'</tr>'
);
coreStats.numOfCoreType = 0;
}
coreStats.numOfCoreType++;
coreStats.prevCoreType = this.coreType;
});
最后,您的sort
回调函数有一个bug,无法对数组进行正确排序。它可能在一个简单的测试用例中工作,但它将无法对其他数组进行排序。它必须处理所有三种情况:
,并为每种情况返回一个适当的值,可能如下所示:
coreInfo.sort( function( a, b ) {
return(
a.coreType < b.coreType ? -1 :
a.coreType > b.coreType ? 1 :
0
);
});
coreInfo.sort(函数(a,b){
返回(
a、 coreTypeb.coreType?1:
0
);
});
为了验证我的假设,您可以发布一个实际JSON数据的示例,而不是一个格式化的表吗?下面是从脚本
[{“coreDate”:“050415”,“jid”:“dspillman”,“coreType”:“runBrowser_11”,“fileName”返回的原始未格式化JSON:“\/var\/www\/html\/rhcCores\/coreFiles\/050415\/dspillman
\/gdb.log.runBrowser\u 11.20150504.dspillman\u CORE\u 040515-1202”,{“coreDate”:“050415”,“jid”:“ssamari”,“coreType”:“mdMgr\u 10”,“fileName”:“\/var\/www\/html\/rhcCores\/coreFiles\/0504045\/ssamari\/gdb.log.mdMgr\u 10.2015050504.ssamari”[开始时,我猜这是一个对象数组。coreInfo是返回的json.data。我一直认为这是一个对象。如果它是数组,这是默认行为还是我搞乱了什么?我会接受你关于名称的建议。你让我知道了缺失的部分。这是一个doh!时刻。最初我是按照y的方式格式化代码的你建议调试。在我“认为”我做对了之后,我压缩了它,但仍然没有成功。我也会更新排序函数。你的评论对我发送正确的路径非常有帮助。我将尝试使用数组索引访问列表中的第一个coreType,看看它是否有效。如果coreInfo
是一个数组,我将使用它按预期工作,除了尝试访问整个数组而不是单个数组元素上的coreType
和其他属性外,没有任何问题。
$('#cores').html( "<h1>" + cores.length + "</h1><br>Core Files" );
coreInfo.sort( function( a, b ) {
return(
a.coreType < b.coreType ? -1 :
a.coreType > b.coreType ? 1 :
0
);
});