3

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

我的编码如下所示:

文件1.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);
 }
}

文件2.js

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

执行 javascript 时,我收到“未捕获的类型错误:无法读取未定义的属性“列”。

我究竟做错了什么?

4

3 回答 3

1

在 JS 数组中以 index 开头,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" };
}

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

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

一般来说,使用数组字面量和对象字面量来创建空数组和对象被认为是最佳实践,因此代码的开头可能是:

var selection = {};
...
var selectionContainer = [];
于 2013-09-19T13:34:19.840 回答
0

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

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

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

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

如果这没有帮助,那么我们需要更多关于 nrOfEntries 以及它是如何改变的信息。

于 2013-09-19T13:24:36.617 回答
0
    change: function(oEvent){
    selection.column = "someText";
    selection.term = "someOtherText";
    selectionContainer[nrOfEntries] = selection;    
}

将其更改为

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

不再需要 i ,避免忘记填写 selectionContainer[0]

于 2013-09-19T13:30:53.387 回答