Jquery对象在排序后是未定义的,但在firebug中

Jquery object is undefined after sort but is in firebug

本文关键字:但在 firebug 未定义 对象 排序 Jquery      更新时间:2023-09-26

对返回数据的脚本进行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,即数组的第一个元素。

为了帮助跟踪变量是否是数组,我强烈建议给出反映这一事实的数组名称:要么是复数单词,要么在名称中添加ListArray,或者其他东西。像coreInfo这样的名字听起来像一个单数项目。我将称这个数组为coreListcoreArray或简称为cores。为了简洁,我个人喜欢用复数词:cores表示核心信息的数组,core表示该数组中的单个元素。

这样,当你看到cores.coreTypecoreList.coreTypecoreArray.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数据的例子,而不是格式化的表?