forEach不是函数错误

时间:2016-11-22 17:27:50

标签: javascript arrays json ajax

当我尝试使用foreach迭代我的JSON对象时,我收到此错误。 有人可以帮忙吗?

这是我的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

另外,我想知道如果有人愿意解释,我如何迭代这个对象。 :)

6 个答案:

答案 0 :(得分: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.
});

答案 1 :(得分:3)

forEach仅适用于数组,因此如果要迭代对象,则需要执行以下操作:

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

答案 2 :(得分:3)

  

我如何迭代这个对象

你不能,但你可以迭代这个对象的属性。这将使用Object.keys()完成,它返回一个填充了对象属性(或键)的数组

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

请注意,.forEach实际上是Array.prototype.forEach。这意味着在一个数组上调用该函数,不是一个对象。

答案 3 :(得分:2)

setTimeout

答案 4 :(得分:1)

为什么不直接使用for..in?

例如:

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解决方案是有帮助的。理解vanilla javascript的机制通常会解决很多问题,如果没有不必要的复杂性或者在需要应用特定逻辑的区域之外进行修改,库无法解决这些问题。

答案 5 :(得分:1)

您不能使用forEach来迭代对象,因为它是Array类方法。

有一些迭代对象的方法:

使用Object.keys()

使用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方法。