Javascript:读取对象数组

时间:2013-09-19 13:20:40

标签: javascript arrays object

我有两个.js文件。在一个,我想用一个具有两个属性的对象填充数组。在另一个文件中,我想循环遍历数组并使用对象属性。

我的编码如下:

file1.js

var selection = new Object();
selection.column = "";
selection.term = "";

var selectionContainer = new Array();
...
press: function(){
 var i;
 for (i=1;i<=selectionContainer.length;i++){
  selection = selectionContainer[i];
  alert("Search Term: " + selection.column + selection.term);
 }
}

file2.js

change: function(oEvent){
 selection.column = "someText";
 selection.term = "someOtherText";
 selectionContainer[nrOfEntries] = selection;
}

执行javascript时,我收到'未捕获的TypeError:无法读取属性'列'未定义'。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

JS数组以索引0开头,最后一个元素位于.length - 1。因此,您需要将循环更改为从0开始并使用<而不是<=

for (i=0;i<selectionContainer.length;i++){

您收到的错误Uncaught TypeError: Cannot read property 'column' of undefined'是因为当您的计数器到达selectionContainer.length时,您试图读取数组末尾的元素,这本身并不会出错,它只返回undefined,但后来undefined.column给出错误。

但是 - 虽然它有点难以分辨,因为我不确定你没有显示的代码 - 在的代码中显示它看起来像是在填充你的数组对相同对象的多个引用,因为在change函数中,您更新现有selection对象的属性,然后将该对象的引用放入数组中。我相信你需要在那时创建一个新对象:

change: function(oEvent){
  selection = new Object();
  selection.column = "someText";
  selection.term = "someOtherText";
  selectionContainer[nrOfEntries] = selection;
}

...但更简单的方法是使用对象文字:

change: function(oEvent){
  selectionContainer[nrOfEntries] = { column : "someText", term : "someText" };
}

您没有说nrOfEntries是什么,但是当JS为您提供.length属性时,您不需要单独的变量来跟踪数组中元素的数量。在任何情况下,如果你只是想添加到数组的末尾,你可以这样做:

  selectionContainer.push( { column : "someText", term : "someText" } );

通常,最好使用数组文字和对象文字来创建空数组和对象,因此代码的开头可能是:

var selection = {};
...
var selectionContainer = [];

答案 1 :(得分:0)

首先 - 为什么从索引开始循环1.如果你从第一个元素开始是不正确的:

for (var i=0;i<selectionContainer.length;i++) {

其次,最好使用push方法向数组中添加元素。例如:

selectionContainer.push(selection);
nrOfEntries = selectionContainer.length;

如果这没有帮助,那么我们需要有关nrOfEntries及其更改方式的更多信息。

答案 2 :(得分:0)

    change: function(oEvent){
    selection.column = "someText";
    selection.term = "someOtherText";
    selectionContainer[nrOfEntries] = selection;    
}

将其更改为

    change: function(oEvent) {
        selectionContainer.push({column : 'someText', term : 'someOtherText});
}

你不再需要我了,你不要忘记填写selectionContainer [0]