Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用循环修改对象文字时的forEach上下文_Javascript_Foreach - Fatal编程技术网

Javascript 使用循环修改对象文字时的forEach上下文

Javascript 使用循环修改对象文字时的forEach上下文,javascript,foreach,Javascript,Foreach,我正在尝试将两个对象数组合并为一个,这在应用程序(GoogleMapsAPIv3)中更有意义。我发现obj2未定义错误。据我所知,它是连接到上下文的——我在forEach循环中调用一个函数,它无权访问“upper”循环中的对象。如何传递上下文或重新定义这些循环以使其工作节点和生成包含对象列表。这些对象是简单的键值集 database = new Array; function processData(nodes,generation) { nodes.forEach(function(v

我正在尝试将两个对象数组合并为一个,这在应用程序(GoogleMapsAPIv3)中更有意义。我发现
obj2未定义
错误。据我所知,它是连接到上下文的——我在forEach循环中调用一个函数,它无权访问“upper”循环中的对象。如何传递上下文或重新定义这些循环以使其工作<代码>节点和
生成
包含对象列表。这些对象是简单的键值集

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);
              }
        }

从外观上看,您的代码击中了这一部分:

    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 :[]
       };
    }

确保它可以访问“upper”forEach的上下文,JavaScript允许您这样做。这不是您面临的问题。如果“nodes”和“generation”是数组,为什么不使用“for”(var n=0;nWell,对象在generation.forEach(function(value2){…}循环中变得未定义。尽管事实上“this”值仍然是相同的。@LucioM.Tato我知道我可以(我稍后再试),但我不明白这里发生了什么,这让我很困惑。事实上我没有明确地说出来,但错误发生在前面-我更新了问题。+1但应该指出,
delete obj2
实际上没有任何作用。@sirVir:这是因为您的
var
声明被提升到了该内部函数的顶部n、 所以在赋值之前它是未定义的。你应该应用这个答案,因为它会修复它,但是要知道你现在正在覆盖外部作用域中的
obj2
。如果你不想这样做,那么你应该在内部作用域中使用不同的变量名。这就是我想要的-我将值推送到数组array并准备另一个对象作为下一个条目。但是如果我刚刚定义了它,为什么它没有定义呢?@DulabCMS
{var local='test';}alert(local);
alerts
'test'
,因为在javascript
{}
中没有定义范围(除非使用
let
而不是
var