
1.3.10 使用映射来映射值
需要存储许多条目,并且让这些条目具有易于查找的键是一种常见的情形。例如,假设我们将一个音乐收藏分为不同的流派:

对于每种流派,我们将存储许多艺人或作曲人的详细信息。可以采用的一种方法是创建一个类来代表每个流派,但是这种方法会浪费我们的编码时间。因此使用映射来解决这个问题。映射是一个泛型类,接受两种类型:为映射使用的键的类型,以及在映射中存储的对象的类型。
键是唯一值,允许我们存储值或者快速查找值,这就使得映射成为快速查找值的一种好方法。键可以是任何类型,而值更是没有限制。对于音乐收藏这个例子,我们将创建一个使用映射的类,将音乐流派作为键,并使用一个字符串数组来代表作曲人或艺人:

我们调用set方法来填充映射,如下所示:

从映射取值很简单,只需要使用对应的键调用Get方法即可:

在这里需要对返回值添加undefined关键字,因为指定的映射条目有可能不存在。如果没有处理未定义的情况,TypeScript会发出警告。在这里,TypeScript同样努力为我们的代码提供一个健壮的防护网。
现在可以填充音乐收藏,如下所示:


如果只添加一个艺人,代码会变得稍加复杂。使用set时,我们要么在映射中添加一个新条目,要么用新条目替换现有的一个条目。因此,我们需要判断是否已经添加过特定的键。这就需要调用has方法。如果没有添加过传入的流派,就用一个空数组调用set。最后,我们使用get从映射中取出数组,然后使用push添加这些值:

我们还需要修改Add方法。现有的实现会覆盖之前调用Add添加的特定流派,这意味着先调用AddArtist,然后调用Add,将会导致Add调用覆盖我们单独添加的那些艺人:

修改Add方法很简单,只需要迭代歌手并调用AddArtist方法,如下所示:

现在,填充完HeavyMetal流派后,相关艺人将包括Iron Maiden、Tygers of Pan Tang、Saxon和Doro。