2012-04-08 12 views
34

Próbuję użyć hashtable, dzięki czemu mogę wybrać określony obiekt przechowywany w tablicy/obiektu. Mam jednak problem z zapętlaniem się obiektu.Iterowanie po obiekcie hashtable

var pins= {}; 
pins[6] = '6'; 
pins[7] = '7'; 
pins[8] = '8'; 

$('#result3').append('<div>Size: ' + Object.size(pins) + '</div>'); 
for(var i = 0; i < Object.size(pins); i++) { 
    $('#result3').append('<div>' + pins[i] + '</div>'); 
} 

JSFiddle: http://jsfiddle.net/7TrSU/

Jak widać w TEST 3 który używa obiektu pin do przechowywania danych, jestem coraz undefined gdy zapętlenie przez obiekt pin.

Jaki jest prawidłowy sposób na przejście przez pin?

EDIT

Co się stanie, jeśli zamiast tylko pin[6] = '6' robię pin [6] = przedmiot i chcę pętli przez wszystkich swoich id właściwości? Rzeczywisty fragment kodu, co robię ...

for(var i = 0; i < json.length; i++) { 
    markerId = json[i].listing_id 

    // Place markers on map 
    var latLng = new google.maps.LatLng(json[i].lat, json[i].lng); 
    var marker = new google.maps.Marker({ 
       listing_id: markerId, 
       position: latLng, 
       icon: base_url + 'images/template/markers/listing.png', 
    }); 

    markers[markerId] = marker; 
} 

for(var marker in markers) { 
    console.log('marker ID: ' + marker.listing_id); 
    mc.addMarker(marker); 
} 

console.log powyżej zwraca niezdefiniowana, a jeśli zrobię console.log(marker) zamian otrzymuję wartość marker.listing_id. Przepraszam, zaczynam się mylić!

Udało mi się go uruchomić z $.each(markers, function(i, marker){});, ale dlaczego powyższy for..in nie działa?

+2

możliwość dodawania członków w indeksach 6, 7 i 8, ale iteracji od 0 do 2. Lepszą strategią byłoby iterować od '0' do' length-1' i testować, czy członkowie istnieją przed próbą użycia. – RobG

+0

jesteś mylący _arrays_ z _objects_. – c69

+0

@ c69-tablice są obiektami; ;-) Problem OP próbuje uzyskać dostęp do nieistniejących właściwości. – RobG

Odpowiedz

38

Nie należy używać pętli for(i=0; i<size; i++). Zamiast tego, zastosowanie:

  1. Object.keys(pins) aby uzyskać listę właściwości, a pętla przez niego, lub
  2. Użyj for (key_name in pins) w połączeniu z Object.hasOwnProperty (wykluczyć właściwości dziedziczyć) pętli właściwości.

Problem z trzecim przypadkiem testowym polega na tym, że odczytuje wartości klawiszy 0, 1 i 2 (zamiast 6, 7, 8).

-1

Numer pin rozpoczyna się od 6 do 8, ale pętle for od 0 do 3 (długość obiektu). Musisz wykonać pętlę od 6 do 6 + the_size_of_the_object.Coś takiego:

for(var i = 6, len = 6 + Object.size(pins); i < len; i++) { 
    $('#result3').append('<div>' + pins[i] + '</div>'); 
} 

Albo coś w tym jest to, co lubię:

for(var i = 5; pin = pins[++i];) { 
    $('#result3').append('<div>' + pin + '</div>'); 
} 
+0

Byłoby lepiej, gdyby dodać "if (pin.hasOwnProperty (i)) ..." przed próbą użycia elementu do usunięcia nieistniejących elementów. – RobG

84
var hash = {} 
hash[key] = value 

Object.keys(hash).forEach(function (key) { 
    var value = hash[key] 
    // iteration code 
}) 
+0

Zmienna wartości jest tworzona po użyciu. – Yster

3

Ponieważ używasz jQuery:

jQuery.each(pins, function (name, value) { 
    $('#result3').append('<div>' + name + "=" + value + '</div>'); 
}); 
+0

Użyłem twojej metody i działa tak, jak chcę, ale nie rozumiem, dlaczego użycie 'for..in' nie działa zgodnie z oczekiwaniami ... Zaktualizowany oryginalny wpis ... – Nyxynyx

+0

Ponieważ używałeś' for. .in', aby policzyć liczbę przedmiotów, a nie aby znaleźć ich nazwy. Gdy się dowiedziałeś, że są trzy przedmioty, patrzysz na przedmioty o nazwach 0, 1 i 2, ale przedmioty nazywały się 6, 7 i 8. – Quentin

2

Wypróbuj :

for (var pin in pins) { 
    $('#result3').append('<div>' + pin + '</div>'); 
} 

Example fiddle

+1

dla ... w pętlach są suboptymalne – Raynos

+3

@Raynos nie, nie są. Jednak brak 'hasOwnProperty' jest. – c69

+1

@ c69 'for ... in' jest nadal suboptymalne, ponieważ jest mniej wydajne niż" Object.keys ". 'hasOwnProperty' to kosztowne połączenie – Raynos

2
function iterate(obj){ 
    var keys = Object.keys(obj); 
    for(i in keys){ 
     doSomething(obj[keys[i]].id); 
    } 
} 

This iteracje nad id wszystkich pól w dowolnym obiekcie