【问题标题】:forEach is not a function errorforEach 不是函数错误
【发布时间】: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");}else{console.log("doesn't");}
        })
      });
}

这是有问题的对象:

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

【问题讨论】:

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

标签: javascript arrays json ajax


【解决方案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 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-28
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          • 2018-03-02
          • 2022-08-18
          • 2018-12-02
          相关资源
          最近更新 更多