快速了解我的背景:
我试图每秒创建一个对象。该对象直接创建到数组的最后位置,该数组记住在最近一个之前创建的设定数量的对象
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())来更新数组中每个对象的属性时,会返回一个错误,指出对象未定义。我知道它们是未定义的,因为它们没有分配给唯一变量(至少不是我所知道的)。如何识别对象或如何为它们创建唯一的容器,以便在阵列中访问它们?
答案 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());