我有一个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
循环内)
更新:我想出来了,这是使用var
和newObject
之间的问题。有关详细信息,请参阅下面的答案。
答案 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);