2016-08-01 32 views
0

Ich habe diese beiden Objektkonstruktoren und Arrays:Erstellen und auf ein Array-Objekt drückt und immer „nicht lesen kann Eigenschaft‚‘undefinierter

//Houses 
var houseArray = []; 

//Generate street adress 
var houseStreets = [..., ..., ...]; 

var generateAddress = function(){ 
    var index = round(random(0, houseStreets.length)); 
    var num = round(random(0, 9999)); 
    return num + " " + houseStreets[index]; 
}; 

// House constructor and prototypes 
var House = function(address, x, y) { 
    this.address = address; 
    this.x = x; 
    this.y = y; 
}; 

House.prototype.draw = function() { 
    rectMode(CENTER); 
    rect(this.x, this.y, 30, 20); 
    rectMode(CORNER); 
}; 


//Households 

var householdArray = []; 

//Generate household names 
var householdNames = [..., ..., ...]; 

var generateName = function(){ 
    var index = round(random(0, householdNames.length)); 
    return householdNames[index]; 
}; 

//Household constructor and prototypes 
var Household = function(name, house) { 
    this.name = name; 
    this.house = house.address; 
    this.x = house.x; 
    this.y = house.y; 
    this.isHomeOwner = true; 
    this.isSelling = false; 

}; 

Household.prototype.draw = function() { 
    ellipse(this.x, this.y, 10, 10); 
}; 

Household.prototype.determinMove = function() { 
    if(random(0, 100) <= 75){ 
     this.isSelling = true; 
    } 
}; 

In der Anfangsphase meiner Simulation erstellen I 20 Haushalte und 20 Häuser und die 20 Haushalte befinden sich in den 20 Häusern:

// Populate initial houses 
noFill(); 
houseArray.push(new House(generateAddress(), 15, 10)); 
houseArray.push(new House(generateAddress(), 50, 10)); 
houseArray.push(new House(generateAddress(), 85, 10)); 
houseArray.push(new House(generateAddress(), 120, 10)); 
houseArray.push(new House(generateAddress(), 155, 10)); 
houseArray.push(new House(generateAddress(), 190, 10)); 
houseArray.push(new House(generateAddress(), 225, 10)); 
houseArray.push(new House(generateAddress(), 260, 10)); 
houseArray.push(new House(generateAddress(), 295, 10)); 
houseArray.push(new House(generateAddress(), 330, 10)); 
houseArray.push(new House(generateAddress(), 15, 389)); 
houseArray.push(new House(generateAddress(), 50, 389)); 
houseArray.push(new House(generateAddress(), 85, 389)); 
houseArray.push(new House(generateAddress(), 120, 389)); 
houseArray.push(new House(generateAddress(), 155, 389));   
houseArray.push(new House(generateAddress(), 190, 389)); 
houseArray.push(new House(generateAddress(), 225, 389)); 
houseArray.push(new House(generateAddress(), 260, 389)); 
houseArray.push(new House(generateAddress(), 295, 389)); 
houseArray.push(new House(generateAddress(), 330, 389)); 

//Populate initial households 
for (var i = 0; i < houseArray.length; i++){ 
    householdArray.push(new Household(generateName(), houseArray[i])); 
} 

Nun, ich versuche, eine Funktion zu erstellen, die zu Beginn jeder neuen Wendung genannt werden, die 5 neue Haushalte schaffen, die wohnen nicht überall (sind nicht an ein Haus im Haus gebundenArray), und die haben ein zufälliges x (zw n 10 und 390) und zufällige y (zwischen 50 und 350) Positionen und ich kann es nicht scheinen, damit es funktioniert. Hier ist der Code, den ich kam mit:

var newArrival = function() { 
    for (i = 0; i < 5; i++) { 
    householdArray.push(new Household(generateName())); 
    } 
}; 

Aber wenn ich print(householdArray[22].name) erhalte ich eine „nicht lesen kann Eigenschaft‚Name‘undefinierter“ -Fehler. Außerdem habe ich noch nicht herausgefunden, wie ich mit den zufälligen x- und y-Positionen umgehen soll.

Fragen: Was ist falsch an meinem Code? Was wäre ein guter Weg, um eine Funktion zu erstellen, die 5 neue Haushalte in HaushaltArray erstellen würde und eine zufällige x (zwischen 10 und 390) und zufällige y (zwischen 50 und 350) Positionen haben?

UPDATE: Ich glaube, dass das Problem mit dem Household Konstruktor ist. Es scheint den Fall nicht gut zu handhaben, in dem der house Parameter kein Argument ist und ich nicht weiß, wie ich das beheben kann. In meiner newArrival Funktion füttere ich keinen house Parameter da es keinen gibt, die Neuankömmlinge haben noch kein Haus. Das scheint ein Problem zu schaffen. Irgendwelche Ideen, wie das zu beheben ist?

+0

Wo sagt der Debugger, dass Sie diesen Fehler bekommen? Es sollte Ihnen einen Dateinamen und eine Zeilennummer geben. – zero298

+0

Ihr Code scheint nur 5 Elemente auf 'HaushaltArray' zu schieben. Wenn das der Fall ist, wird 'haushaltArray [22]' natürlich 'undefiniert' zurückgeben. – acdcjunior

+0

@acdcjunior Es ist vielleicht nicht einfach zu sehen, aber in der anfänglichen Konfiguration habe ich bereits 20 Elemente im 'HaushaltArray' generiert. Meine Funktion 'newArrival' soll 5 weitere hinzufügen. – neoflash

Antwort

0

Das Problem war in der Tat mit dem Konstruktor. Aus irgendeinem Grund, den ich nicht vollständig verstehe, musste ich dem Konstrukteur sagen, was zu tun ist, wenn der Parameter house nicht eingegeben wurde. Behoben und alles funktioniert gut. Hier ist der Code:

var Household = function(name, house) { 
    if (house === undefined) { 
     this.name = name; 
     this.house = "HOMELESS"; 
     this.x = random(10, 390); 
     this.y = random(50, 350); 
     this.isHomeOwner = false; 
     this.isSelling = false; 
     this.askingPrice = 0; 
    } else { 
     this.name = name; 
     this.house = house; 
     this.x = house.x; 
     this.y = house.y; 
     this.isHomeOwner = true; 
     this.isSelling = false; 
     this.askingPrice = 0; 
    } 
};