Verificarea lungimii obiectului dicționar [duplicat] (Programare, Javascript)

PositiveGuy a intrebat.

Încerc să verific lungimea aici. Am încercat să număr. Este ceva ce îmi scapă?

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

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

dNames conține perechi nume/valoare. Știu că dNames are valori în acel obiect, dar tot sare complet peste asta și când alertez chiar și dName.length, evident că nu așa se face asta… deci nu sunt sigur. Am căutat pe web. Nu am putut găsi nimic în acest sens.

Comentarii

  • Nu există o proprietate „length” pe obiectele simple. Aceasta este ceva ce au instanțele Array. –  > Por Pointy.
  • Ok, știe cineva care este modalitatea corectă sau politicoasă de a acorda răspunsul? Știu că sberry a venit cu adevărat cu „răspunsul”, dar meder a reușit să îl explice unui tip intermediar JS ca mine. Nu vreau să enervez pe nimeni. –  > Por PositiveGuy.
  • Se acordă răspunsul persoanei al cărei răspuns a funcționat pentru tine. –  > Por KareemElashmawy.
4 răspunsuri
Greg Hornby

Ceea ce fac eu este să folosesc Object.keys() pentru a returna o listă cu toate cheile și apoi să obțin lungimea acesteia

Object.keys(dictionary).length

Comentarii

  • Exact ceea ce aveam nevoie! Noroc –  > Por Gesias.
  • FYI pentru ceilalți care încă mai suportă IE8: Niciun rezultat. link –  > Por JR MacDonald.
  • În Chrome 53, văd că Object.keys(dictionary) raportează o lungime de 1, chiar dacă este un dicționar gol. Are o intrare numită „$type”. –  > Por user9999999991.
  • cea mai folosită soluție și probabil cea mai proastă, trebuie să parcurgeți în buclă întregul dicționar pentru a obține lungimea, deci este O(n) în loc de O(1) cum ar trebui să fie, ugh – –  > Por RenaissanceProgrammer.
  • Acum că javascript are obiectul Map, probabil că este mai bine să îl folosiți și să folosiți new Map().size –  > Por Greg Hornby.
sberry
var c = {'a':'A', 'b':'B', 'c':'C'};
var count = 0;
for (var i in c) {
   if (c.hasOwnProperty(i)) count++;
}

alert(count);

Comentarii

  • ok, deci trebuie să iterați prin… nu există nicio modalitate de a face acest lucru de pe un obiect personalizat care are nume/valori? –  > Por PositiveGuy.
  • Eu nu am cred că că există. Asigurați-vă că verificați „hasOwnProperty” pentru a opri iterația în josul lanțului de prototipuri și verificați doar proprietățile. –  > Por sberry.
  • Mulțumesc… Sunt mai mult un tip OOP, dar încep să mă obișnuiesc mai mult cu JS. –  > Por PositiveGuy.
  • Acesta este cel mai fiabil mod de a face acest lucru în JS. Vezi nota lui sberry despre hasOwnProperty de asemenea. Cheia, @coffeeaddict, este că un obiect JS se poate comporta ca, dar nu este în mod fundamental același lucru cu un obiect „colecție” în alte limbaje. De aici și lipsa deconcertantă a unei metode convenabile pentru a obține numărul total de proprietăți ale acestuia. –  > Por Ben Zotto.
meder omuraliev

Această întrebare este confuză. Un obiect obișnuit, {} nu are un length proprietate, cu excepția cazului în care intenționați să vă faceți propriul constructor de funcții care generează obiecte personalizate care o au ( caz în care nu ați specificat ).

Adică, trebuie să obții „lungimea” printr-un for..in asupra obiectului, deoarece length nu este setată, și să incrementezi un contor.

Nu înțeleg de ce aveți nevoie de „the length. Setați manual 0 pe obiect, sau vă bazați pe chei de șir personalizate? de exemplu, pe chei de șir? obj['foo'] = 'bar';. În cazul în care acesta din urmă, din nou, de ce este nevoie de lungime?

Editare #1: De ce nu poți face asta?

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

Apoi iterați peste listă? length este deja setat.

Comentarii

  • Deci, o matrice are o proprietate de numărare… pentru că probabil că for este încorporat în tipul nativ JS? –  > Por PositiveGuy.
  • [] are length, {} nu folosește o for bucla cu length pentru [] și un for..in for {}. –  > Por meder omuraliev.
  • Ca să îți răspund la întrebare da, este confuz pentru că nu sunt un tip JS, sunt un tip C#. Așa că trebuia să verific lungimea dicționarului meu pentru a testa dacă are vreun obiect în el. Pentru gestionarea obișnuită a erorilor cred că ar trebui să verifici dacă un dicționar este nul, dar am vrut doar să văd câte s-au întors și au fost adăugate în dicționarul meu. Așadar, problema nu era cum să iterăm, ci doar să vedem cum să obținem numărul, ceea ce am crezut că se poate face cu un obiect de tip dicționar (nvp), ca să zic așa. –  > Por PositiveGuy.
  • da, folosesc obj[‘foo’] = ‘bar’; tipul de afacere pentru a obține ceva care acționează ca un dicționar. –  > Por PositiveGuy.
Cees Timmerman

Numărați și arătați cheile dintr-un dicționar (rulați în consolă):

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

Exemplu de ieșire:

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

Funcție simplă de numărare:

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