J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Jag har problem med en Array, den vill inte dela värdena efter fnuttarna, utan håller ihop allting.
I en dd ska man välja ett tema med språk, som det finns tre av (dk/se/de). Om man väljer se och de, ska två av tre texter (txt_alttext) vid textrutan få texten Swedish resp German. Problemet är att den första får "Swedish", "German", dessutom med fnuttarna. Den andra blir "undefined".
Anledningen till att fnuttarna finns där är att Arrayer skapas med fnuttar mellan värdena, men här verkar den inte bry sig om detta.
Strängen "Swedish", "German" ska alltså bli en array, men det blir den inte.
(Om jag tar bort fnuttarna vid tilldelningen, blir det likadant, fast utan fnuttar.)
Varför???
for (i = 0; i < form.tema_id2_sprak_id2.length; i++){
if (form.tema_id2_sprak_id2.options[i].selected){
var tema_sprak_value = form.tema_id2_sprak_id2.options[i].value;
var sprak_id = tema_sprak_value.slice(tema_sprak_value.lastIndexOf("-")+1);
if ((!dk_valt) && (sprak_id == 2)){
valt++
dk_valt = true;
land += "\"Danish\", "
}
else if ((!se_valt) && (sprak_id == 5)){
valt++
se_valt = true;
land += "\"Swedish\", "
}
else if ((!de_valt) && (sprak_id == 8)){
valt++
de_valt = true;
land += "\"German\", "
}
}
}
arr_land = new Array(land.substring(0,land.lastIndexOf(",")))
//avmarkera valt antal alttext. valt-1 eftersom valt<=3, och [] är <=2
for (i = valt - 1; i > -1; i--){
form.alttext[i].disabled = false;
form.alttext[i].value = "";
document.all["txt_alttext"][i].innerHTML = arr_land[i];
}
JojoxxMedlem sedan juni 20004 308 inlägg Jag tror du har missuppfattat funktionen på slice. slice är en metod av array som returnerar en del av arrayen. Om du exempelvis har en array med namnet foo kan du plocka ut de 2 första värdena från arrayen med newArray=foo.slice(0,2); Om du har en textsträng som ser ut så här "dk,se,de" och vill göra en array av den använder du (string)-metoden split; minArray=textString.split(",");
Men om du förklarar vad du har (en dropdown-meny, en text-sträng eller vad det är) så kan vi nog lösa det enkelt.
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Nja, Slice kan användas till strängar också, http://www.devguru.com/Technologies/ecmascript/quickref/string_slice.html, och det är inte här felet ligger.
Den raden plockar fram sprak_id ur följande drop-down
<option value="46-2">growing advice - danish</option>
<option value="16-5">harvesting - swedish</option>
<option value="25-2">lime condition - danish</option>
<option value="25-5">lime condition - swedish</option>
<option value="25-8">lime condition - german</option>
där 2, 5 eller 8 är språket. Det fungerar, eftersom jag får värde i variabeln land.
Den som inte fungerar är att få land=("Danish", "Swedish") att bli en array, arr_land, då den "håller ihop" dem.
Min alternativa väg hade varit att läsa första värdet ur strängen, skriva ut/radera det, läsa nästa, men det verkar väldigt b-kodat, och krångligt, dessutom ska array ju fungera!
Dock, jag har nog missat att man kan göra/ska göra arrayer som du skriver till sist? Tror jag har blandat ihop två saker, för denna länk visar det jag vill.
http://www.devguru.com/Technologies/ecmascript/quickref/string_split.html
J.N.Medlem sedan apr. 20031 660 inlägg Och, mycket riktigt, det fungerar med
arr_land = new String(land).split(",")
istället för den arr_land som står där nu.
Tack för hjälpen på rätt spår!
JojoxxMedlem sedan juni 20004 308 inlägg Ja, precis. Det är nog split du söker. Betänk detta;
var land=new Array("Danish", "Swedish");
är inte ekvivalent med;
str='"Danish", "Swedish"';
var land=new Array(str);
Det du menar i första exemplet är detta (vilket funkar);
str='"Danish", "Swedish"';
var land=eval("new Array("+str+")");
Men split är som sagt snyggare.
Peter SMedlem sedan dec. 20025 483 inlägg Red: Problemet är tydligen redan löst :)
Anledningen till att det inte fungerar är att du inte deklarerat dina variabler till att vara av en viss typ, exempelvis String(). Det som händer nu är att det lagras ett initialt värde i dessa innan den första tilldelningen; och detta är undefined.
En annan sak du slarvat med är att deklarera variablerna explicit, d.v.s. med nyckelordet var:
var land = "";
Om du inte deklarerar dem explicit kommer JavaScript att deklarera dem implicit åt dig, vilket i praktiken innebär att de skapas som globala variabler, vilket i sin tur innebär ett mer minneskrävande program.
:)
JojoxxMedlem sedan juni 20004 308 inlägg
Peter S skrev:
Red: Problemet är tydligen redan löst
Jamen det är alltid trevligt med fler tips :)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
De är deklarerade, ovanför for står
var valt = 0;
var dk_valt = false;
var se_valt = false;
var de_valt = false;
var land = "";
Dock ska villigt medges att det kanske ska stå vilken typ det ska vara, men det har jag nästan aldrig sett, antar du menar
var land = new String();
Anledningen att den andra variabeln blir undefined är att jag blandade ihop sakerna :r vilket Jojoxx har hjälpt till att reda ut. arr_land[1] fanns helt enkelt inte, eftersom det inte är (var) en array, som jag förstår det.
Peter SMedlem sedan dec. 20025 483 inlägg Det spelar inte så stor roll på vilket sätt du deklarerar variablerna, huvudsaken är att det görs.
:)