Javascript Typescript foreach变量不可用
我有一个foreach循环,在这里我创建一个新的临时数组,然后运行一个嵌套的foreach循环。然后我尝试访问嵌套的foreach循环中的temp数组,但返回时出现了一个变量notavailable错误Javascript Typescript foreach变量不可用,javascript,arrays,scope,typescript,Javascript,Arrays,Scope,Typescript,我有一个foreach循环,在这里我创建一个新的临时数组,然后运行一个嵌套的foreach循环。然后我尝试访问嵌套的foreach循环中的temp数组,但返回时出现了一个变量notavailable错误 let final = { array: [] }; myArray.forEach(item => { let newObject = { items: [] }; item.subArray.forEach(subItem => {
let final = {
array: []
};
myArray.forEach(item =>
{
let newObject = { items: [] };
item.subArray.forEach(subItem =>
{
var subObject = { prop: subItem.prop };
// Error here: "newObject is not available"
newObject.items.push(subObject);
});
// Error here: "final is not available"
final.array.push(newObject);
});
我知道我可以通过将它作为参数提供给数组,例如:item.subray.forEachsubItem=>{},this
但这对我没有帮助,因为类级别上不存在tempArray
当我尝试将我的临时数组分配给在foreach外部声明的最终数组时,我也遇到了同样的问题
有没有办法从foreach中访问父范围
我应该指出,这段代码存在于类上定义的函数中。我基本上是试图从子数组中聚合具有特定值的属性
显示问题的屏幕截图:
图像中可见的代码位于第一个forEach循环中
更新:我发现了这一点,这是使用let和var之间的问题。有关详细信息,请参阅下面的答案。更新:我终于发现了这一点。在我的实际代码中,我使用TypeScript的let关键字创建新对象。我把它改为var,它开始工作了
把这归咎于我不理解let block scope和var global scope之间的区别——噢
下面列出的解决方案也适用于我,但简单地将let更改为var意味着我的原始代码可以完美地工作
我通过使用map而不是forEach解决了这个问题:
粘贴到问题中的代码不能是真实代码。如果是的话,你访问finalArray就不会有问题了 这两个代码片段的结果非常不同 第一个将为您提供最后一个项的子项的所有属性的数组 秒将为您提供一个数组,其中每个数组包含子项的属性 如果我理解正确,您想要的是获得一个包含所有子项的所有属性的单个数组。因此,您希望将每个项映射到子项属性的数组,然后将结果展平到单个数组中 这个怎么样
var items = [
{subitems:[
{prop:1},
{prop:2},
]},
{subitems:[
{prop:3},
{prop:4},
]},
]
var result = items.map(function(item){
return item.subitems.map(function(subitem){
return subitem.prop;
})
}).reduce(function(prev,curr){
return prev.concat(curr);
},[]);
console.log(result);
这和第一次做的事情不一样。您文章中的代码只存储最后一个映射。@TamasHegedus是的,公平点。实际上我在问题中使用了错误的代码,我会更新它们。如果你是正确的,代码是我实际代码的简化版本。在我的实际代码中,我迭代一个数组,为子数组中的每个项建立一个新对象,并将其添加到一个新数组中。我简直无法理解为什么我不能访问foreach中的tempArray变量-我假设这是TypeScriptok的一个怪癖,所以这里有两个问题,一个是关于变量范围的,为此我需要一张大图来了解finalArray超出范围的原因。第二个问题是如何绘制地图,然后展平。我想我已经回答了。对不起,我的措辞很糟糕——变量范围问题是我唯一的问题:我已经更新了我的问题,使之更符合我的用例。这是一张截图对不起!在第一个forEach循环中显示问题代码。我重新创建了与您的屏幕截图类似的内容。即使使用关键字letas,它也能正常工作。您使用的是什么版本的typescript?我使用的是typescript版本1.8.9
var items = [
{subitems:[
{prop:1},
{prop:2},
]},
{subitems:[
{prop:3},
{prop:4},
]},
]
var result = items.map(function(item){
return item.subitems.map(function(subitem){
return subitem.prop;
})
}).reduce(function(prev,curr){
return prev.concat(curr);
},[]);
console.log(result);