2016-11-22 2 views
-1

Я получаю эту ошибку, когда пытаюсь выполнить итерацию через свой объект JSON с помощью foreach. Может кто-нибудь помочь, пожалуйста?forEach не является функцией ошибки

Вот мой JS:

function dateTimeChecker() { 
    $.ajax({ 
      "url": 'get-booked.php', 
      "method": "get", 
      "dataType": "text", 
      "cache": false 
     }).done(function(jBooked) { 
      var jBookedDates=JSON.parse(jBooked); 
      console.log(jBookedDates); 
       jBookedDates.forEach(function(jB){ 
        if (jB=="11/01/2016") {console.log("works");}else{console.log("doesn't");} 
     }) 
     }); 
} 

А вот объект в вопросе:

enter image description here

Кроме того, мне интересно, как я могу перебрать этот объект, если кто-то заботится, чтобы объяснить , :)

+0

Можете ли вы сделать [mcve] без звонков AJAX, пожалуйста? Я не могу воспроизвести ошибку. –

+0

его объект не массив. так что, возможно, вы не можете использовать foreach здесь. – Mahi

+0

Извините, я думал, что имеет смысл поставить ajax. –

ответ

3

Ответ, который вы получаете, - это JSON. Вы не можете использовать метод объекта массива forEach над простым объектом. Вы должны использовать Object.keys() в этом контексте для получения перечислимых собственных свойств принадлежит к анализируемой JSON,

Object.keys(jBookedDates).forEach(function(jB){ 
if (jB=="11/01/2016") { 
    console.log("works"); 
} else { 
    console.log("doesn't"); 
} 
}); 

Для вашего запроса в комментариях, можно использовать кронштейн нотацию для доступа к этим массивам,

Object.keys(jBookedDates).forEach(function(jB){ 
    var arr = jBookedDates[jB]; 
    console.log(arr); //will print the array belongs to each property. 
}); 
+0

спасибо за ответ. Я работаю, но теперь мне интересно, как получить доступ к этим массивам, которые содержатся в каждом из моих объектов. вы можете помочь? –

+0

@RobertRoss Смотрите мои правки. –

3

Foreach работает только на массивах, так что если вы хотите перебрать объект, который вы должны будете сделать:

for (var attr in obj) { 
    // attr is your obj object attribute 
    if (obj.hasOwnProperty(attr)) { 
     // the magic goes here 
    } 
} 
+2

Использование 'for in' без проверки hasOwnProperty приводит к переходу через перечислимые свойства прототипа. –

+0

О, я забыл положить его сюда, мой плохой. Спасибо @RajaprabhuAravindasamy – MarioAleo

3

как я могу перебрать этот объект

Вы не можете, но вы можете перебрать свойств этого объекта. Это будет сделано с использованием Object.keys(), который возвращает массив , заполненный свойствами объекта (или ключами).

Object.keys(jBookedDates).forEach(function(key) { 
    //jBookedDates[key] will give you the value for the current property 
}); 

Пожалуйста, имейте в виду, что на самом деле .forEachArray.prototype.forEach. Это означает, что функция вызывается в массиве, не объект.

1

Почему бы просто не использовать для ... вместо этого?

например:

function dateTimeChecker() { 
$.ajax({ 
     "url": 'get-booked.php', 
     "method": "get", 
     "dataType": "text", 
     "cache": false 
    }).done(function(jBooked) { 
     var jBookedDates=JSON.parse(jBooked); 
     console.log(jBookedDates); 
     for (key in jBookedDates) { 
      if (jBookedDates.hasOwnProperty(key)) 
       if (jBookedDates[key] == "11/01/2016") 
       { 
        console.log("works"); 
       } else { 
        console.log("doesn't"); 
       } 
} 
    }); 

}

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

1

Вы не можете перебирать объекты, используя forEach, так как это метод класса Array.

Есть несколько способов для перебора объекта:

Использование объекта.ключи()

Вы используете Object.keys() метод, чтобы получить ключи от объекта, то итерацию над ним:

var keys = Object.keys(jBookedDates); 

keys.forEach(function(key) { 
    var item = jBookedDates[key]; 
    // Do your logic here 
    // You will have access to the `key` variable and `item` variable 
} 

Использование jQuery.each()

JQuery обеспечивает улучшенный forEach метод, который работает как с Коллекция jQuery, массив или объект.

$.each(function(key, item) { 
    // Do your logic here 
    // You also will have access to `key` and `item` variables 
}); 

Многие другие фреймворки/библиотеки Javascript предоставляют настраиваемый метод foreach.

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