繁体   English   中英

Javascript:读取对象数组

[英]Javascript: read Array of Objects

我有两个.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:无法读取属性'列'未定义'。

我究竟做错了什么?

在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.如果你从第一个元素开始是不正确的:

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

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

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

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

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

将其更改为

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM