forEach 不是函数错误

Posted

技术标签:

【中文标题】forEach 不是函数错误【英文标题】:forEach is not a function error 【发布时间】:2017-04-06 11:51:33 【问题描述】:

当我尝试使用 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");elseconsole.log("doesn't");
        )
      );

这是有问题的对象:

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

【问题讨论】:

你能在没有 AJAX 调用的情况下创建一个minimal reproducible example 吗?我无法重现错误。 它的对象不是数组。所以也许你不能在这里使用 foreach 。 对不起,我认为放 ajax 也是有意义的。 for (var key in object) 然后在里面 forEach 应该在阵列上工作。但 forEach 仅适用于数组,不适用于对象。 【参考方案1】:

您收到的响应是 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.
);

【讨论】:

感谢您的回答。它可以工作,但现在我想知道如何访问我的每个对象包含的这些数组。你能帮忙吗?【参考方案2】:

forEach 只适用于数组,所以如果你想迭代一个对象,你需要这样做:

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

【讨论】:

使用 for in 而不检查 hasOwnProperty 也会导致遍历原型可枚举属性。 哦,我忘了把它放在这里,我的错。谢谢@RajaprabhuAravindasamy【参考方案3】:

如何迭代这个对象

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

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

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

【讨论】:

【参考方案4】:
Object.keys(a).forEach(elem =>   console.log(a[elem]) )

【讨论】:

【参考方案5】:

为什么不直接使用 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 的机制通常会为您解决很多问题,如果没有在需要应用特定逻辑的区域之外的不必要的复杂性或修订,库就无法解决这些问题。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于forEach 不是函数错误的主要内容,如果未能解决你的问题,请参考以下文章

JS 'body.forEach 不是函数' 上的错误

forEach 不是函数

foreach在Angular 8中不是函数

未捕获的 TypeError:forEach 不是 javascript 函数中的函数错误

forEach 不是函数 javascript

未捕获的类型错误:routes.forEach 不是函数