在检测数组中未定义的对象时遇到问题

时间:2014-09-10 02:23:08

标签: javascript

快速了解我的背景:

  • - 学习了大约3个月;
  • - 为一家小型软件公司提供技术支持。 2年exp。
  • - 很多知识是二手的,我还在学习基础知识

我试图每秒创建一个对象。该对象直接创建到数组的最后位置,该数组记住在最近一个之前创建的设定数量的对象

function Fruit(name, position) {
   this.name = name;
   this.position = position;
}

var showXMostRecentFruits = 20;

var fruitCounter = 0;
function generateName() {
   var name = 'Experimental Fruit' + fruitCounter;
   return name;
}

var fruitsArray = [];

function shiftFruits() {
   for (i = 0; i < showXMostRecentFruits; i++) {
      fruitsArray[i] = fruitsArray[i + 1];
}

function updateFruitPositions() {
   for (i = 0; i < showXMostRecentFruits; i++) {
      fruitsArray[i].position = i;
   }
}

var fruitTimer; //used for setting and clearing setTimeout

function createNewFruit() {
   shiftFruits();
   fruitsArray[showXMostRecentFruits - 1] = new Fruit(generateName());
   updateFruitPositions();
   fruitCounter += 1;

   fruitTimer = setTimeout(function() {
      createNewFruit();
   }, 1000);
}

假设函数createNewFruit()运行一次

createNewFruit();

然后我尝试从数组中提取一些含义

console.log(fruitsArray[19];

我得到的只是:

Fruit {}
undefined

这个问题是当我想运行一个循环(请参阅updateFruitPositions())来更新数组中每个对象的属性时,会返回一个错误,指出对象未定义。我知道它们是未定义的,因为它们没有分配给唯一变量(至少不是我所知道的)。如何识别对象或如何为它们创建唯一的容器,以便在阵列中访问它们?

2 个答案:

答案 0 :(得分:0)

在尝试写入其中一个属性之前,您需要测试给定元素是否设置为某个元素。

而不是......

for (i = 0; i < showXMostRecentFruits; i++) {
   fruitsArray[i].position = i;
}

使用此:

for (i = 0; i < showXMostRecentFruits; i++) {
   if (fruitsArray[i])
       fruitsArray[i].position = i;
}

你从最后填充数组,盯着元素20.没有if (fruitsArray[i]),你正试图为前19个元素设置undefined.position = i

答案 1 :(得分:0)

您可以用更有效的方式替换 showFruits 函数:

function shiftFruits() {
  if (fruitsArray.length > showXMostRecentFruits) {
      fruitsArray.shift();
  }
}

updateFruitPositions 只需要更新存在的成员,长度由 shiftFruits 控制:

function updateFruitPositions() {
   for (i = 0; i < fruitsArray.length; i++) {
      fruitsArray[i].position = i;
   }
}

或支持 forEach

function updateFruitPositions() {
   fruitsArray.forEach(function(fruit, i){fruit.position = i});
}

所以它只访问存在的成员。 createNewFruit 有:

fruitsArray.push(new Fruit(generateName());