如何将矩阵中的对象转换为另一种类型?



我有一个业务对象的二维数组,我需要将其转换为它们的"模型";表示(稍后发送到服务器)。

我想到的最简单的转换是:

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

最新更新