Jquery对象在排序后是未定义的,但在firebug中
Jquery object is undefined after sort but is in firebug
对返回数据的脚本进行ajax调用。我在firebug中看到的数据是正确的。当数据返回时,我做一个排序,它也有效。在firebug中,对象按我想要的方式排序。排序后,我尝试访问一个键/值对。我在firebug中看到我想要的键/值在对象中。当我尝试使用对象键/值分配给var时,它是未定义的。我在尝试聚合重复的数据。如果我用的不是最好的方法,请帮我用更好的方法。
数据样本
coreDate "060115"
coreType "asterisk_11"
fileName "/var/www/html/Cores/gdb.hamid.asterisk.060115"
jid "hamid"
$.when (
$.ajax( {
type:"GET",
url: 'cf.php',
dataType: 'json',
timeout: 120000,
})
)
.done(function(coreInfo) {
coreInfo.sort(function(a,b) { return a.coreType > b.coreType } );
var coreStats={};
coreStats.numOfCores=0;
coreStats.numOfCoreType=0;
coreStats.prevCoreType=coreInfo.coreType;
// for some reason coreInfo.coreType is not defined. The coreInfo object exists and coreType is there. I tried this.coreType but is undefined.
$.each(coreInfo, function() {
coreStats.numOfCores++;
if (coreStats.prevCoreType != this.coreType) {
// This works. why do I have to access this.coreType instead of coreInfo.coreType?
$('#list > tbody:last-child').append('<tr><td><a href="'+this.fileName+'">'+this.coreType+'</td><td>'+coreStats.numOfCoreType+'<br>core</td><td>jid</td></tr>');
coreStats.numOfCoreType=0;
}
coreStats.numOfCoreType++;
coreStats.prevCoreType=this.coreType;
// setting prevCoreType works here
});
$('#cores').html("<h1>"+coreStats.numOfCores+"</h1><br>Core Files");
})
.fail(function() {
});
从你的代码和描述中,听起来coreInfo
是一个对象数组,是这样吗?如果它是一个对象,它就不会有sort()
方法,你的代码就会停在那里。
如果它是一个数组,它没有像coreInfo.coreType
这样的属性。数组的每个元素是一个具有coreType
和其他属性的对象。这就是为什么您能够在$.each()
回调中访问this.coreType
。$.each()
逐个元素遍历数组,并将每个单独的元素传递给回调函数。
看起来你在Firebug中看到$.each()
之外的coreInfo.coreType
,我怀疑你实际上看到的是coreInfo[0].coreType
,即数组的第一个元素。
为了帮助跟踪变量是否是数组,我强烈建议给出反映这一事实的数组名称:要么是复数单词,要么在名称中添加List
或Array
,或者其他东西。像coreInfo
这样的名字听起来像一个单数项目。我将称这个数组为coreList
、coreArray
或简称为cores
。为了简洁,我个人喜欢用复数词:cores
表示核心信息的数组,core
表示该数组中的单个元素。
这样,当你看到cores.coreType
或coreList.coreType
或coreArray.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;
});
请注意,上面代码中的标记中缺少一个</a>
。如果您像缩进原始HTML代码一样缩进标记字符串,而不是将它们全部塞进一行,那么就更容易发现这样的错误。
一个小问题:你不需要把$.ajax()
包装在$.when()
里面。$.ajax()
返回一个可以直接使用的Promise。
不需要计算coreStats.numOfCores
的代码。您可以简单地使用数组的length
属性。如果你按照我的建议调用数组cores
,你可以这样做:
$('#cores').html( "<h1>" + cores.length + "</h1><br>Core Files" );
最后,你的sort
回调函数有一个错误,不能正确排序数组。它可能在一个简单的测试用例中工作,但它将无法对其他数组进行排序。它必须处理所有三种情况:<
、==
和>
,并为每种情况返回适当的值,可能如下所示:
coreInfo.sort( function( a, b ) {
return(
a.coreType < b.coreType ? -1 :
a.coreType > b.coreType ? 1 :
0
);
});
验证我的假设,你可以张贴你的实际JSON数据的例子,而不是格式化的表?
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- jquery代码在Mozilla中有效,但在其他浏览器上无效
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 如何将字符串拆分为字符,但在javascript中保留空格
- JavaScript获胜't运行,但在jsFiddle中工作
- 列表样式在IE中未设置为none,但在IE中适用
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- 滚动在Chrome中有效,但在Firefox或IE中无效
- jQuery href 属性添加在 Firebug 中可见,但在源代码中不可见
- js文件中脚本的一部分在Firebug控制台上正常工作,但在页面中不起作用
- svg 图像被添加到 DOM 中,但除非在 Firebug 中触摸,否则不可见
- JavaScript 返回“不是函数”错误,但该方法在 Firebug 中的响应中列出
- Jquery /javascript函数在firebug控制台中工作,但在页面加载时不起作用
- Jquery函数在firebug控制台中工作,但在页面中不起作用
- Ajax成功函数不工作,但显示在firebug控制台中
- 在firebug中可以看到值,但数组长度显示为未定义
- JavaScript代码在通过Firebug插入时可以工作,但在中插入时不能工作
- 我的正则表达式在在线编辑器中工作,但在FireBug中,它使浏览器崩溃
- 原型setStyle宽度自动工作在firebug,但不是在页面
- Jquery对象在排序后是未定义的,但在firebug中