Typescript foreach变量不可用

时间:2016-03-27 13:13:14

标签: javascript arrays scope typescript

我有一个foreach循环,我在其中创建一个新的临时数组,然后运行嵌套的foreach循环。我正在尝试访问嵌套的foreach循环中的临时数组,但它会返回“变量不可用”错误。

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

我知道我可以通过提供this作为参数提供item.subArray.forEach(subItem => {},(例如:this ); forEach

但这对我没有帮助,因为tempArray在类级别不存在。

当我尝试将临时数组分配给在foreach之外声明的“final”数组时,我遇到同样的问题。

有没有办法可以从foreach中访问父作用域?

我应该指出这个代码存在于一个类上定义的函数中。我基本上试图从子数组

中聚合具有特定值的属性

显示问题的屏幕截图:http://i.imgur.com/HWCz0Ed.png
(图像中可见的代码在第一个let循环内)

更新:我想出来了,这是使用varnewObject之间的问题。有关详细信息,请参阅下面的答案。

2 个答案:

答案 0 :(得分:0)

更新:我终于弄明白了。在我的实际代码中,我使用TypeScript的let关键字创建了var。我将其更改为let,然后开始工作。

请问我不理解var(块范围)和let(全局范围)之间的区别 - d'oh!

下面列出的解决方案也适用于我,但只需将var更改为map()就意味着我的原始代码可以正常运行。

我使用forEach()代替var final = { array: [] }; var finalArray = myArray.map(function (item) { let newObject = { items: [] }; var tempArray = item.subArray.map(function (subItem) { var subObject = { prop: subItem.prop }; return subObject; }); newObject.items = tempArray; return newObject; }); final.array = finalArray; 解决了这个问题:

If CheckBox1.Checked = True And OpenOfficeDone = False Then
     OpenOffice.RunWorkerAsync()
     workTmr.Stop()
End If
If CheckBox2.Checked = True And ZipDone = False Then
      Zip.RunWorkerAsync()
      workTmr.Stop()
 End If

答案 1 :(得分:0)

您粘贴到问题中的代码不得是您的真实代码。如果是的话,你可以毫无困难地访问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);