jQuery $.each() не работает с объектом, как ожидалось

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть следующий объект:

 var objectVar = {
    4 : { "key" : "key-name4", "item4" : {} },
    3 : { "key" : "key-name3", "item3" : {} }
}
  

Затем я пытаюсь выполнить следующее:

 $(objectVar).each(function(index,record){
    console.log(record); // Loops Only Once and Logs Full Object
});
  

Кто-нибудь может мне помочь, почему $.each(); функция выполняет итерацию по вложенным объектам внутри основного объекта?

Любая помощь будет оценена!

Ответ №1:

«Кто-нибудь может мне помочь, почему функция $.each(); выполняет итерацию по вложенным объектам внутри основного объекта?»

Для зацикливания вложенных объектов вам нужны вложенные циклы.

Хотя использование метода each() [docs], подобного вашему, обычно иногда работает (как сейчас), он действительно предназначен для элементов DOM.

Вместо этого используйте метод jQuery.each() [docs]:

 $.each( objectVar, function(index,record){
    console.log(record); 

      // start a loop on the current record in the iteration
    $.each( record, function( index2, sub_record ) {
        console.log( index2, sub_record );
    });
});
  

Теперь ваш цикл будет расширен до первого уровня вложенных объектов.

Если вы не уверены в общей структуре и хотите перечислить всю глубину, вам нужно будет проверить каждое встречающееся значение, чтобы определить, следует ли его перечислять.

Комментарии:

1. Спасибо за отличное объяснение! Я знаю, что это выходит за рамки OP, но знаете ли вы, есть ли способ заставить функцию each() анализировать в порядке пронумерованных ключей вместо порядка, в котором записи отображаются внутри объекта?

2. @dSquared: Нет, на самом деле нет никакого способа сделать это с объектом. Единственный способ — определить массив, который описывает желаемый порядок, затем выполнить итерацию массива и извлечь связанный элемент из объекта. Итак, если у вашего объекта есть ключи 7,3,9,4 , вы можете создать массив arr=[3,4,7,9] для определения порядка, затем выполнить итерацию массива и выполнить objectVar[ arr[i] ] . Но это становится немного сложнее.

3. …чтобы получить последовательный порядок цифровых клавиш, вам действительно следует использовать массив в первую очередь.

Ответ №2:

Вы должны использовать метод $.each вместо .каждый метод:

 $.each(objectVar, function(index, record) {
  console.log(record);
});
  

Ответ №3:

 $.each(objectVar,function(index,record){
    console.log(record);

});
  

Ответ №4:

Хотя jQuery великолепен, вы на самом деле его не используете. Цикл JavaScript по объектам довольно прост, как есть:

 var record;
for(var key in objectVar) {
    record = objectVar[key];
}
  

Ответ №5:

Вы неправильно используете $.each() для объектов, отличных от jQuery:

 $.each( objectVar, function( index, record ){
    console.log( record );
});
  

jQuery.each()