2010-07-26 20 views
102

Próbuję sprawdzić tutaj długość. Wypróbowana liczba. Czy jest coś, czego mi brakuje?Sprawdzanie długości obiektu słownikowego

var dNames = {}; 
dNames = GetAllNames(); 

for (var i = 0, l = dName.length; i < l; i++) 
{ 
     alert("Name: " + dName[i].name); 
} 

dNames zawiera pary nazwa/wartość. Wiem, że dNames ma wartości w tym obiekcie, ale wciąż całkowicie to przeskakuje i kiedy ostrzegam nawet dName.length oczywiście nie jest tak, jak to zrobić ... więc nie jestem pewien. Sprawdziłem to w Internecie. Nie można znaleźć niczego na ten temat.

+2

Nie ma właściwości "długość" na zwykłych obiektach. To jest coś, co mają instancje Array. – Pointy

+0

Ok, czy ktoś zna właściwy lub grzeczny sposób udzielenia odpowiedzi? Wiem, że sberry wpadł na naprawdę "odpowiedź", ale meder był w stanie wyjaśnić to pośrednikowi JS, takiemu jak ja. Nie chcę nikogo wkurzyć. – PositiveGuy

+0

Przyznajesz odpowiedź osobie, która odpowiedziała za Ciebie. – KareemElashmawy

Odpowiedz

7
var c = {'a':'A', 'b':'B', 'c':'C'}; 
var count = 0; 
for (var i in c) { 
    if (c.hasOwnProperty(i)) count++; 
} 

alert(count); 
+0

ok, więc musisz wykonać iterację ... nie ma możliwości zrobienia tego z niestandardowego obiektu, który ma nazwy/wartości? – PositiveGuy

+2

Nie ** myślę, że istnieje. Upewnij się, by sprawdzić "hasOwnProperty", aby zatrzymać iterację w dół łańcucha prototypów i sprawdzić tylko właściwości. – sberry

+0

Dzięki .. Jestem bardziej facetem z OOP, ale zaczynam przyzwyczajać się do JS. – PositiveGuy

1

To pytanie jest mylące. Obiekt regularny, {}, nie ma właściwości length, chyba że masz zamiar utworzyć własny konstruktor funkcji, który generuje niestandardowe obiekty, które go mają (w takim przypadku nie określono).

To znaczy, musisz uzyskać "długość" przez instrukcję for..in obiektu, ponieważ length nie jest ustawiona i zwiększać licznik.

Nie jestem pewien, dlaczego potrzebujesz length. Czy ręcznie ustawiasz obiekt na 0, czy też polegasz na niestandardowych klawiszach ciągowych? np. obj['foo'] = 'bar';. Jeśli to znowu, dlaczego potrzeba długości?

Edytuj nr 1: Dlaczego nie możesz tego zrobić?

list = [ {name:'john'}, {name:'bob'} ]; 

Następnie powtórzyć listę? Model length jest już ustawiony.

+0

Więc tablica ma właściwość count ... ponieważ prawdopodobnie jest ona wbudowana w rodzimy typ JS? – PositiveGuy

+4

'[]' ma 'długość',' {} 'doesnt. użyj pętli 'for' z' length' dla '[]' i 'for..in' dla' {} '. –

+1

Aby odpowiedzieć na twoje pytanie tak, jest to mylące, ponieważ nie jestem facetem JS, jestem facetem C#. Musiałem więc sprawdzić długość mojego słownika, aby sprawdzić, czy zawiera on jakieś obiekty. Dla zwykłej obsługi błędów domyślam się, że po prostu sprawdzasz wartość null w słowniku, ale chciałeś tylko zobaczyć, ile z nich zostało zwróconych i zostało dodane do mojego słownika. Problem nie polegał więc na tym, żeby powtórzyć, po prostu zobaczyć, jak uzyskać licznik, który, jak mi się wydawało, mógłbym za pomocą obiektu typu słownikowego (nvp) "powiedzieć". – PositiveGuy

0

policzyć i pokaż klucze w słowniku (uruchomić w konsoli):

o=[];count=0; for (i in topicNames) { ++count; o.push(count+": "+ i) } o.join("\n") 

Przykładowe wyjście:

"1: Phase-out Left-hand 
2: Define All Top Level Taxonomies But Processes 
3: 987 
4: 16:00 
5: Identify suppliers" 

Prosta funkcja count:

function size_dict(d){c=0; for (i in d) ++c; return c} 
254

Co mogę zrobić, to użycie Object.keys(), aby zwrócić listę wszystkich kluczy, a następnie uzyskać długość tego

Object.keys(dictionary).length 
+1

Właśnie tego potrzebowałem! Pozdrawiam – Gesias

+11

FYI dla pozostałych wciąż wspierających IE8: Bez kości. [link] (http://kangax.github.io/es5-compat-table/#Object.keys) –

+0

W przeglądarce Chrome 53 widzę Object.keys (słownik) o długości 1, mimo że jest to pusty słownik . Ma wpis o nazwie "typ $". – user99999991

Powiązane problemy