将行添加到JavaScript数组不能按预期工作

时间:2014-03-13 16:04:52

标签: javascript arrays

我有一个表格,可以提交与给定日期相关的多行数据。其中一个字段是百分比(即:0-100)。我可以有一个给定日期的三行,百分比加起来为100(或不是,但这是一个不同的验证问题)或两行具有不同的日期和相关的百分比等。

我需要跟踪所有内容并在提交时将所有百分比排序到正确的日期存储区中,以便我可以进行验证。

为此,我创建了一个数组PctArray。 PctArray的每个元素都是一个两个字段的对象 - 日期,pct。当我遍历提交的数据时,我检查每一行的日期以查看它是否已经在PctArray中,如果是,则递增该日期的相关pct字段并继续。如果没有,我在PctArray中创建一个新元素并插入信息。

如果只提交了一行,或者甚至是一行的几行,这一切都可以正常工作。但是,当我第二次提交信息时,它就会窒息。在这一点上,我给你代码:

                        // If this is our first row to process

                    if(PctArray.length == 0){
                        PctArray[0] = new Object();
                        PctArray[0].effdt = datefield.options[datefield.selectedIndex].value;
                        PctArray[0].pct = parseInt(pctfield.value); 
                    }
                    else{
                        // We loop through the array to see if this EffDt exists yet. Not very efficient, but the array will always be small
                        var found = "no";

                        for(p=0;p<PctArray.length;p++){
                            if(PctArray[p].effdt == datefield.options[datefield.selectedIndex].value){
                                PctArray[p].pct = PctArray[p].pct + parseInt(pctfield.value);   
                                found = "yes";
                            }   
                        }

                        if(found == "no"){
                            PctArray[PctArray.length] = new Object();
                            PctArray[PctArray.length].effdt = datefield.options[datefield.selectedIndex].value;
                            PctArray[PctArray.length].pct = pctfield.value; 
                        }

                    }

初始化,当它是第一行时,一切都会创建并插入就好了。但是,当我需要进入if(found == "no")的块时,它会创建新元素,但在第一个赋值语句中死掉Unable to set value of the property 'effdt': object is null or undefined

我不明白。我在这两个地方宣称新元素是相同的方式,但是有些东西我不知道它第二次不喜欢它。

我也尝试将new Object()替换为{"effdt":'', "pct":''},结果相同。它适用于顶部,而不是底部。

我迷路了。有谁看到我在这里缺少的东西?

感谢。

1 个答案:

答案 0 :(得分:1)

PctArray[PctArray.length] = new Object();
PctArray[PctArray.length].effdt = datefield.options[datefield.selectedIndex].value;

第一次分配后PctArray.length已增加,因此您尝试解决不存在的元素。您可以通过组合分配来改进代码,而无需使用明确的new Object()

PctArray.push( 
  { effdt: datefield.options[datefield.selectedIndex].value
  , pct: pctfield.value 
  })