【问题标题】:forEach context when using loop to modify object literal使用循环修改对象字面量时的 forEach 上下文
【发布时间】:2013-11-02 01:27:20
【问题描述】:

我正在尝试将两个对象数组合并为一个,这在应用程序中更有意义(google maps api v3)。我收到obj2 is undefined 错误。据我了解,它与上下文有关-我在 forEach 循环中调用了一个函数,并且它无法访问“上部​​”循环中的对象。如何传递上下文或重新定义这些循环以使其工作? nodesgeneration 包含对象列表。这些对象是简单的键值集。

database = new Array;
function processData(nodes,generation) {


  nodes.forEach(function(value)
  {
     var obj = {
     lat : value.Latitude,
     lng : value.Longitude,
     data : {ID: value.Node, 
            timentries : []}
     }

     currentDate = generation[0].datetime;
     var obj2 =
     {
        time: currentDate,
        technologies :[]
     }

     generation.forEach(function(value2)
     {
        if (value2.datetime == currentDate)
        {
           if (value2.node == obj.data.ID)
              {
                 var obj3 = {
                    type : value2.technology,
                    output : value2["output"],
                    emission : value2["emissions"]
                 }
                 obj2.technologies.push(obj3);
              }
        }
        else
        {
           timentries.push(obj2)
           currentDate = value2.datetime;
           delete obj2;
           var obj2 =
           {
              time: currentDate,
              technologies :[]
           }

        }
     })


  database.push(obj)   
  })
};
$( document ).ready(function() {
    loadData(processData);
});

第一次引用obj2时出现错误:

 if (value2.datetime == currentDate)
        {
           if (value2.node == obj.data.ID)
              {
                 var obj3 = {
                    type : value2.technology,
                    output : value2["output"],
                    emission : value2["emissions"]
                 }
                 obj2.technologies.push(obj3);
              }
        }

【问题讨论】:

  • 确保它可以访问“上层”forEach 的上下文 - JavaScript 可以让你做到这一点。这不是你面临的问题。
  • 如果“nodes”和“generation”是数组,为什么不使用“for(var n=0;n
  • 好吧,对象在 generation.forEach(function(value2) {...} 循环中变得未定义。尽管事实上“this”值仍然相同。
  • @LucioM.Tato 我知道我可以(我稍后会尝试),但我不明白这里发生了什么,这让我感到困惑。

标签: javascript foreach


【解决方案1】:

从外观上看,您的代码正在执行此部分:

    else
    {
       timentries.push(obj2)
       currentDate = value2.datetime;
       delete obj2;
       var obj2 =
       {
          time: currentDate,
          technologies :[]
       }

    }

请注意,您正在删除 obj2 并在“else”块的本地范围内重新声明 obj2。无需删除它(实际上无论如何都不会影响变量)并重新声明它。而不是这些行,只需执行以下操作:

    else
    {
       timentries.push(obj2)
       currentDate = value2.datetime;
       obj2 =
       {
          time: currentDate,
          technologies :[]
       };
    }

【讨论】:

  • 其实我没有明确说出来,但是错误发生的更早-我更新了问题。
  • +1 但应该指出delete obj2 实际上并没有做任何事情。
  • @sirVir:这是因为您的 var 声明被提升到该内部函数的顶部,因此在分配发生之前它是 undefined。您应该应用此答案,因为它将修复它,但请注意,您现在正在从外部范围覆盖 obj2。如果你不想这样,那么你应该在内部范围内使用不同的变量名。
  • 这就是我想要的 - 我将值推送到数组数组并准备另一个对象作为下一个条目。但是如果我刚刚定义它为什么是undefined
  • @DulabCMS { var local = 'test'; } alert(local); alerts 'test' 因为在 javascript {} 中没有定义范围(除非您使用 let 而不是 var
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多