2012-04-08 8 views
34

Я пытаюсь использовать хеш-таблицу, поэтому я могу выбрать конкретный объект, хранящийся в массиве/объекте. Тем не менее, у меня возникает проблема, связанная с объектом.Итерация через объект 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/

Как вы можете видеть в TEST 3, который использует объект pin для хранения данных, я получаю undefined когда зацикливание через объект pin.

Каков правильный путь для прохождения через pin?

EDIT

Что произойдет, если вместо того, чтобы просто pin[6] = '6', я делаю контактный [6] = объект, и я хочу, чтобы перебрать все их id свойства? Фактический фрагмент кода, что я делаю ...

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 выше возвращает неопределенное значение, и если я console.log(marker) вместо этого, я получаю значение marker.listing_id. Извините, я смущаюсь!

Мне удалось заставить его работать с $.each(markers, function(i, marker){});, но почему же for..in не работает?

+2

Вы добавляете пользователей на индексы 6, 7 и 8, но итерация от 0 до 2. Лучшей стратегией будет итерации от '0' до' length-1' и проверьте, существуют ли элементы, прежде чем пытаться их использовать. – RobG

+0

Вы сбиваете с толку _arrays_ с _objects_. – c69

+0

@ c69-массивы - это объекты, ;-) Проблема OP пытается получить доступ к несуществующим свойствам. – RobG

ответ

38

Не используйте петлю for(i=0; i<size; i++). Вместо этого используйте:

  1. Object.keys(pins), чтобы получить список свойств, и цикл через него, или
  2. Используйте for (key_name in pins) в сочетании с Object.hasOwnProperty (для исключения наследовать свойства) перебрать свойства.

Проблема вашего третьего тестового примера заключается в том, что он считывает значения ключей 0, 1 и 2 (вместо 6, 7, 8).

-1

pin начинается с 6 до 8, но цикл for петли от 0 до 3 (длина объекта). Вам нужно пройти от 6 до 6 + the_size_of_the_object.Что-то вроде этого:

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

Или что-то вроде этого, это то, что мне нравится:

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

Было бы лучше, если бы вы добавили 'if (pin.hasOwnProperty (i)) ... перед тем, как попытаться использовать участника, чтобы отсеять несуществующие. – RobG

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

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

Значение переменной создается после использования. – Yster

3

Поскольку вы используете JQuery:

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

Я использовал ваш метод, и он работает так, как я его хочу, но я не понимаю, почему использование 'for..in' не работает по желанию ... Обновлено Исходное сообщение ... – Nyxynyx

+0

Потому что вы использовали' for. .in', чтобы подсчитать количество элементов, чтобы не узнать их имена. Как только вы узнали, что есть три предмета, вы смотрите на предметы с именами 0, 1 и 2, но предметы были названы 6, 7 и 8. – Quentin

2

Попробуйте это :

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

Example fiddle

+1

для ... в цикле являются оптимальными – Raynos

+3

@ Raynos нет, это не так. Однако отсутствие 'hasOwnProperty'. – c69

+1

@ c69 'for ... in' по-прежнему субоптимально, потому что он менее эффективен, чем' Object.keys'. 'hasOwnProperty' - дорогой звонок – Raynos

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

Это итерацию по id всех полей в любом объекте

Смежные вопросы