尝试在jquery中推送数组时的奇怪输出

时间:2015-03-21 10:26:06

标签: javascript jquery arrays

我已经编写了以下代码,我将输出作为cannot read property 'push' of undefined

var data = [
            { MFG_NAME: "ABC", CONCATED_MKT_SHARE: "01-OCT-14|0.59" },
            { MFG_NAME: "XYZ", CONCATED_MKT_SHARE: "01-OCT-14|0.87" },
            { MFG_NAME: "ABC", CONCATED_MKT_SHARE: "01-NOV-14|0.25" },
            { MFG_NAME: "XYZ", CONCATED_MKT_SHARE: "01-NOV-14|0.67" },
            { MFG_NAME: "ABC", CONCATED_MKT_SHARE: "01-DEC-14|0.10" },
            { MFG_NAME: "XYZ", CONCATED_MKT_SHARE: "01-DEC-14|0.03" }
           ];
var cmname  = new Array();
var cmdate  = new Array();
var crank   = [];
var mktshare = new Array(); 
for(i=0;i<data.length; i++ ){
    var name = data[i].MFG_NAME;
    for(j=0; j<data.length; j++){   
        mkt_share = new Array();
        cdate = new Array();
        if(name=data[j].MFG_NAME)
        {
            cmsk_data = data[j].CONCATED_MKT_SHARE.split('|');
            cdate[j].push(cmsk_data[0]) ;  //Here I am getting the error
            mkt_share[j].push(cmsk_data[1]) ; //Here I am getting the error
        }
    }
    cmdate[i] = cdate;      
    mktshare[i] = mkt_share;
        alert(cdate);
}
cmname[i] = name;

然后我将其更改为以下代码。它在警报中提供了一个奇怪的输出

  var data = new Array();
data = <?php echo $result; ?>;  
var dlen    = data.length;
var cmname  = new Array();
var cmdate  = new Array();
var crank   = [];
var mktshare = new Array(); 
for(i=0;i<data.length; i++ ){
    var name = data[i].MFG_NAME;
    for(j=0; j<data.length; j++){   
        mkt_share = new Array();
        cdate = new Array();
        if(name=data[j].MFG_NAME)
        {
            cmsk_data = data[j].CONCATED_MKT_SHARE.split('|');
            cdate[j] = cmsk_data[0] ;
            mkt_share[j] = cmsk_data[1] ;
        }
    }
    cmdate[i] = cdate;      
    mktshare[i] = mkt_share;
     alert(cdate);
}
cmname[i] = name; alert(cmname);

我在循环

中的警告alert(cdate)中获得以下输出

enter image description here

为什么我得到此输出而不是警报中的输出必须是01-OCT-14,01-NOV-14,01-DEC-14

警报alert(cmname)也提供与下面相同的输出

enter image description here

而在警报中输出必须是ABC,XYZ

3 个答案:

答案 0 :(得分:0)

导致错误的原因是您试图推送数组中不存在的项目;分别为cdate[j]mkt_share[j]push()方法仅适用于数组类型,因此您应该在没有索引器的cdate anf mkt_share上调用它:

cdate.push(cmsk_data[0]);
mkt_share.push(cmsk_data[1]);

Example fiddle

答案 1 :(得分:0)

您在

中收到错误
cdate[j].push(cmsk_data[0]) ; 

因为cdate[j]未定义。

答案 2 :(得分:0)

您正在尝试回读cdate数组中的元素j,然后push将新对象读回到数组中。要添加新元素,请直接使用数组名称,如下所示。

cdate.push(cmsk_date[0]);

您也可以在任何时候执行检查以确保定义数组:

if (cdate != undefined) {
   cdate.push(cmsk_data[0]) ;
}

此外,您的代码存在一些问题:

 if(name=data[j].MFG_NAME)
        {
            cmsk_data = data[j].CONCATED_MKT_SHARE.split('|');
            cdate[j].push(cmsk_data[0]) ;  //Here I am getting the error
            mkt_share[j].push(cmsk_data[1]) ; //Here I am getting the error
        }

您要在条件语句中指定name,而不是比较,您应该使用=====。例如:

if (name == data[j].MFG_NAME) { }

此外,您还要为for循环中的每次迭代创建两个新数组:

for(j=0; j<data.length; j++){   
        mkt_share = new Array();
        cdate = new Array();
}

如果data的长度为1,000,则会在客户端的浏览器上创建2,000个阵列并占用内存。