Javascript Typescript foreach变量不可用

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 => {

我有一个foreach循环,在这里我创建一个新的临时数组,然后运行一个嵌套的foreach循环。然后我尝试访问嵌套的foreach循环中的temp数组,但返回时出现了一个变量notavailable错误

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