webForumDet fria alternativet

Felmeddelande - not an object

JavaScript

8 svar · 556 visningar · startad av skyman

Medlem sedan juli 20012 450 inlägg
Frågan#1

Denna kod:

<html>
<head>
<script language="javascript">
<!--
function LoadForm(){
	var myArr = new Array();
	myArr["4.0"]["0"]["NETWORK"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
}
//-->
</script>
</head>
<body onload="LoadForm();">
</body>
</html>

Ger felmeddelande:
'4.0.0' is null or not an object...
Vad betyder det?
Är det ett felaktigt sätt att definera en array?

Medlem sedan juni 20004 308 inlägg
#2

Jepp. En array använder tal (integer) som nyckel meddans "4.0", "0" och "NETWORK" är strängar. Ett Object kan liknas vid en array vid detta hänsende där du kan ha egenskaper till objektet. Så här:

	var myArr={
		"4.0":{
			"0":{
				"NETWORK":["lite text", "???", "", "bla bla", "bla bla", "read"]
			}
		}
	}

(anm. myArr är kanske inte det mest logiska längre med tanke på att det inte är en array)

myArr["4.0"]["0"]["NETWORK"] är nu definierad som en array.

Medlem sedan juli 20012 450 inlägg
#3

Tanken är att jag ska generera en javascript-array med hjälp av php, med information som jag hämtar från en fil.

Jag villl komma ifrån att behöva rita upp en jättearray enligt:

var myArr={
		"4.0":{
			"0":{
				"NETWORK":["lite text", "???", "", "bla bla", "bla bla", "read"]
			}
		}
	}osv...

utan bara kunna skriva:

myArr["4.0"]["0"]["NETWORK"]=[...];
myArr["4.0"]["1"]["NETWORK"]=[...];
myArr["4.0"]["2]["NETWORK"]=[...];

Så fixar mitt javascript resten.

Jag har gjort så att jag har försökt få till en array som du skrev men det blir alldeles för komplicerat med parenteser, kommatecken och andra lösa tecken som ska dit, eller inte...

Har du något tips på hur man kan komma förbi detta?

Medlem sedan dec. 1999419 inlägg
#4

Är det ett felaktigt sätt att definera en array?

Du definerar myArr på ett korrekt sätt men sen försöker du hantera myArr["4.0"] som en array utan att ha definerat den som en sådan.

var myArr = new Array();
	((myArr["4.0"]=[])["0"]=[])["NETWORK"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
Medlem sedan juli 20012 450 inlägg
#5

Ok, då gör jag som RGB sa...

Men kan jag inte stega genom arrayen som vanligt då?

	var myArr = new Array();
			((myArr["4.0"]=[])[0]=[])["network"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			((myArr["4.0"]=[])[0]=[])["network"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			((myArr["4.0"]=[])[0]=[])["network"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			((myArr["4.0"]=[])[0]=[])["software"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			((myArr["4.0"]=[])[0]=[])["software"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			
			((myArr["5.0"]=[])[0]=[])["network"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
			((myArr["5.0"]=[])[0]=[])["software"]=["lite text", "???", "", "bla bla", "bla bla", "read"];
	for(var tspVer in myArr){
		for(var n=0;n<100;n++){
			if(myArr[tspVer][n])
				alert(n);
			else
				n=100;
		}
	}
Medlem sedan juni 20004 308 inlägg
#6

skyman skrev:

myArr["4.0"]=[] ...

Problemet är här att på varje rad skriver du över myArr["4.0"] och skapar en ny tom array och allt som fanns lagrat där tidigare försvinner. En annan variant:

function inject(a,b,c,arr){
	if(!myArr[a]){ myArr[a]={}; } if(!myArr[a][b]){ myArr[a][b]={}; }
	myArr[a][b][c]=arr;
}

var myArr = new Object();
inject("4.0","0","NETWORK",[1,2,3]);
inject("4.0","1","NETWORK",["a","b","c"]);
inject("4.0","2","NETWORK",[4,5,6]);

for(var tspVer in myArr){
	for(var n in myArr[tspVer]){
		for(var nn in myArr[tspVer][n]){
			alert(myArr[tspVer][n][nn]);
		}
	}
}

eller

alert(myArr["4.0"]["0"]["NETWORK"]);
Medlem sedan juli 20012 450 inlägg
#7

Detta ser kanonbra ut...
Jag måste ha lite annorlunda efter som det kan finnas fler av samma:

inject("4.0","0","NETWORK"...

Så jag måste ha ett id till:

inject("4.0","0","NETWORK",[b]0[/b],...

Och då ser den slutgiltiga koden ut:

function inject(a,b1,c,[b]d[/b],arr){
	if(!myArr[a]){ myArr[a]={}; } if(!myArr[a]){myArr[a][b1]={};} [b]if(!myArr[a][b1][c]){myArr[a][b1][c]={};}[/b]
	[b]myArr[a][b1][c][d]=arr;[/b]
}

var myArr = new Object();
inject("4.0","0","NETWORK","1",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","2",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","3",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","17",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","18",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","19",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","20",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","21",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","23",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","24",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","25",["text","mer","ännu mer","lite till","slut..."]);
// osv...

for(var tspVer in myArr){
	for(var n in myArr[tspVer]){
		for(var nn in myArr[tspVer][n]){
			[b]for(var nnn in myArr[tspVer][n][nn]){[/b]
				alert(myArr[tspVer][n][nn][b][nnn][/b]);
			}
		}
	}
}

Tack så mycket för hjälpen...
Jag skulle nästan kunnat offra en arm för att få detta löst! :)

// Döpte om b till b1 för att kunna skriva ut lite fet text...

Medlem sedan juli 20012 450 inlägg
#8

Hmmm...
Jag ska ladda en selectbox med första raden i varje cell...
Jag får felmedelande att selectboxen inte är ett objekt...
Vad är det för fel? Jag har kört med new Option förr och då har det fungerat...

Se nedan:

<html>
<head>
<script language="javascript">
<!--
function inject(a,b,c,d,arr){
	if(!myArr[a]){ myArr[a]={}; } if(!myArr[a][b1]){myArr[a][b1]={};} if(!myArr[a][b1][c]){myArr[a][b1][c]={};} if(!myArr[a][b1][c][d]){myArr[a][b1][c][d]={};}
	myArr[a][b1][c][d]=arr;
}
var myArr = new Object();
inject("4.0","0","NETWORK","0",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","1",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","2",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","3",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","4",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","5",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","6",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","NETWORK","7",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","SOFTWARE","8",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","SOFTWARE","9",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","0","SOFTWARE","10",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","0",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","1",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","2",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","3",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","4",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","5",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","6",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","NETWORK","7",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","8",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","9",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","1","SOFTWARE","10",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","0",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","1",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","2",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","3",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","4",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","5",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","6",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","NETWORK","7",["text","mer","ännu mer","lite till","slut..."]);
inject("4.0","2","SOFTWARE","8",["text","mer","ännu mer","lite till","slut..."]);

x=0;
for(var tspVer in myArr){
	for(var n in myArr[tspVer]){
		for(var nn in myArr[tspVer][n]){
			for(var nnn in myArr[tspVer][n][nn]){
				switch(nn){
					case "NETWORK":
 						[b]if(myArr[tspVer][n][nn][nnn][0] && nnn==0)
 							document.form1.selectNetwork[x] = new Option("'+myArr[tspVer][n][nn][nnn][0]+' '+myArr[tspVer][n][nn][nnn][3]+'", "");[/b]
 						x++;
						break;
					case "SOFTWARE":
						x++;
						break;
				}
			}
		}
	}
}
 //-->
</script>
</head>
<body>
<form name="form1">
<select name="selectNetwork">
<option selected>-</option>
</select>
<input type="text" name="test">
</form>
</body>
</html>
Medlem sedan juni 20004 308 inlägg
#9

Felet beror på att när du försöker skapa en ny option i listan finns den inte definierad eftersom den först definieras längre ner i html-koden. Kör din kod onload istället så kommer det att fungera bättre.

260 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)