web-dev-qa-db-fra.com

Itération à travers une table de hachage objet

J'essaie d'utiliser une table de hachage pour pouvoir sélectionner un objet spécifique stocké dans un tableau/objet. Cependant, j'ai un problème pour boucler un objet.

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/

Comme vous pouvez le voir dans TEST 3 Qui utilise l'objet pin pour stocker les données, j'obtiens undefined lors de la boucle à travers l'objet pin.

Quelle est la bonne façon de parcourir pin?

[~ # ~] modifier [~ # ~]

Que se passe-t-il si au lieu de simplement pin[6] = '6', Je crée pin [6] = un objet et je veux parcourir toutes leurs propriétés id? Extrait de code réel de ce que je fais ...

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);
}

Le console.log Ci-dessus renvoie undefined, et si je fais console.log(marker) à la place, j'obtiens la valeur de marker.listing_id. Désolé je m'embrouille!

J'ai réussi à le faire fonctionner avec $.each(markers, function(i, marker){}); mais pourquoi le for..in Ci-dessus ne fonctionne-t-il pas?

42
Nyxynyx

N'utilisez pas de boucle for(i=0; i<size; i++). Utilisez plutôt:

  1. Object.keys(pins) pour obtenir une liste de propriétés et la parcourir, ou
  2. Utilisez une for ( key_name in pins) en conjonction avec Object.hasOwnProperty (pour exclure les propriétés héritées) pour parcourir les propriétés.

Le problème de votre troisième cas de test est qu'il lit les valeurs des clés 0, 1 et 2 (au lieu de 6, 7, 8).

42
Rob W
var hash = {}
hash[key] = value

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

Puisque vous utilisez jQuery:

jQuery.each(pins, function (name, value) {
    $('#result3').append('<div>' + name + "=" + value + '</div>');
});
5
Quentin
function iterate(obj){
    var keys = Object.keys(obj);
    for(i in keys){
        doSomething(obj[keys[i]].id);
    }
}

Cela itère sur le id de tous les champs dans n'importe quel objet

3
pbfy0

Essaye ça:

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

Exemple de violon

3
Rory McCrossan