我有一个业务对象的二维数组,我需要将其转换为它们的"模型";表示(稍后发送到服务器)。
我想到的最简单的转换是:
private tiles: Array<Array<Tile>>;
...
let tileModels = this.tiles.map(_tiles=>_tiles.map(tile=>tile.generateModel()));
如果我的数组不为空,这将很好地工作。但如果有任何空对象,我得到错误:
无法读取null属性'generateModel'
我可以把这个转换成这样:
let tileModels = [];
this.tiles.forEach((_tiles) => {
let row = [];
_tiles.forEach((tile) => {
if (tile != undefined) {
row.push(tile.generateModel());
}
});
tileModels.push(row);
});
但是我想知道是否有更好的方法?
谢谢!
注:这是在Angular 10/TS 4.1中实现的,但我对其他语言中可以实现的技巧很感兴趣。
使用可选的链接操作符:
tile?.generateModel()
要从结果中排除这些未定义的值,链afilter
:
this.tiles.map(_tiles=>
_tiles.map(tile=>tile?.generateModel())
.filter(Boolean)
)
如果generateModel
没有机会返回undefined
,那么您可以先应用filter
,然后再应用map
。
如果你想要一个一维的结果,那么用flatMap
代替第一个map
。
对数组应用过滤器以确保删除所有null
值。
const tileModels = this.tiles
.map(tileGroup=>tileGroup
.filter(tile=>!!tile)
.map(tile=>tile.generateModel())
);