Autor Zpráva
quatzael
Profil
Mám jednoduchý script:

for (val in defval)
{
sessionStorage[val] = defval[val];
}

var forlen = defval.length;

A z nějakého důvodu je forlen hodnota undefined. Přitom ten cyklus opravdu několikrát proběhne..

Nevíte někdo prosím kde může být chyba?
Chamurappi
Profil
Reaguji na quatzaela:
V tom případě nejspíš defval není pole.
Jan Tvrdík
Profil
quatzael:
Nevíte někdo prosím kde může být chyba?
Řekl bych, že defval není pole.
quatzael
Profil
Chamurappi, Jan Tvrdík:
A co by to bylo když to má []?

defval by měl být asi zpracovaný JSON, což je podle mě pole, ne?

var defval = eval('(' + answer + ')');



Jan Tvrdík, Chamurappi:
Aha, tak to teda není pole, ale objekt. A jak se tedy dá zjistit počet properties toho pole?
Jan Tvrdík
Profil
quatzael:
A jak se tedy dá zjistit počet properties
V prohlížečích, které podporují EcmaScript 5 by mělo fungovat.

Object.keys(defval).length

Viz také stackoverflow.com/questions/126100/how-to-efficiently-count-the-number-of-keys-properties-of-an-object-in-javascrip
quatzael
Profil
Jan Tvrdík:
díky. Akorát, že stejně asi budu muset hledat úplně jiné řešení, protože celej ten skript má nějaký další mouchy..
1Pupik1989
Profil
Vlastnost length hlavně funguje pouze na indexované pole, čili asociativní vrátí tuším 0, pokud se tam neobjeví žádný index. Objekt vrátí undefined, čili pole to určitě není. Na Object.keys bych si dával bacha, není podpirováno všude. Počítej délku přímo v tom cyklu.

quatzael:
JSON může být jak pole, tak object.

var pole = JSON.parse('[1,2,3,5]');
console.log(pole,pole.length);  //[1, 2, 3, 5] 4 

var objekt = JSON.parse('{"a":1,"b":2,"c":3,"d":5}');
console.log(objekt,objekt.length);  //Object {a: 1, b: 2, c: 3, d: 5} undefined


Asociativní pole se při enkódování do JSON stringu automaticky převede na objekt.
_es
Profil
quatzael:
A jak se tedy dá zjistit počet properties toho pole?
Okrem nedostatočne podporovaného riešenia v [#5] aj pomocou rovnakého cyklu ako v [#1].
Chamurappi
Profil
Reaguji na 1Pupika1989:
hlavně funguje pouze na indexované pole, čili asociativní vrátí tuším 0
Asociativní pole v JS neexistuje. Pokud někdo navěsí na Array nějaké nečíselné vlastnosti (což může udělat vesměs s jakýmkoliv objektem), nemají na nic vliv. Mohl by je stejně tak věšet třeba na Date. Pokusy o práci s Array jako s asociativním polem bývají symptomem nepochopení polí/objektů.
peta
Profil
var forlen = 0; // pridano
for (val in defval)
{
sessionStorage[val] = defval[val];
forlen++; // pridano
}
//var forlen = defval.length;

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: