📜  typescript 数组计数 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:20:43.386000             🧑  作者: Mango

Typescript 数组计数

在 Typescript 中,数组是一个非常常见的数据结构。在许多情况下,我们需要统计数组中某个元素出现的次数。本文将介绍如何使用 Typescript 实现这样的数组计数功能。

方式一:for 循环

最简单的实现方式是通过 for 循环遍历整个数组来计算每个元素的出现次数。代码如下:

function countByForLoop(arr: any[]) {
  const countMap = new Map();
  for (const item of arr) {
    if (countMap.has(item)) {
      const count = countMap.get(item)!;
      countMap.set(item, count + 1);
    } else {
      countMap.set(item, 1);
    }
  }
  return countMap;
}

这个函数的实现方法是使用了一个 Map 对象来存储每个元素的出现次数。在遍历数组的过程中,如果当前元素已经存在于 Map 中,就将其出现次数加 1;否则,将其出现次数初始化为 1。

然而,这种方法有一个明显的缺点:它需要遍历整个数组,因此在数组很大的情况下,它的效率会很低。

方式二:reduce 方法

为了提高效率,我们可以使用 reduce 方法来计算数组中每个元素的出现次数。代码如下:

function countByReduce(arr: any[]) {
  const countMap = arr.reduce((map, item) => {
    map.set(item, (map.get(item) ?? 0) + 1);
    return map;
  }, new Map());
  return countMap;
}

这个函数的实现方法是使用了 reduce 方法来遍历整个数组。在遍历的过程中,对于每个元素,我们都将其放入一个 Map 中,并用当前出现次数加 1 来更新该元素对应的值。使用 reduce 方法可以将这个过程简单地“折叠”到一个函数中,从而提高效率。

方式三:filter、map 和 reduce 方法

除了 reduce 方法外,我们还可以使用 filtermap 方法来实现数组计数。代码如下:

function countByFilterAndMap(arr: any[]) {
  const countMap = arr
    .filter((item, index, self) => self.indexOf(item) === index)
    .map(item => ({ item, count: arr.filter(i => i === item).length }))
    .reduce((map, { item, count }) => {
      map.set(item, count);
      return map;
    }, new Map());
  return countMap;
}

这个函数的实现方法是使用了 filter 方法去重,map 方法计算每个元素的出现次数,以及 reduce 方法将它们放入一个 Map 中。具体地,filter 方法用于去除数组中的重复元素;map 方法计算每个元素在数组中出现的次数,并将其转换为一个包含元素和出现次数的对象;最后,reduce 方法将这些对象逐个放入一个 Map 中。

这种方式的一个优点是它们可以同时处理数字和字符串等各种类型的元素,因为它们并不依赖于元素的类型。

总结

本文介绍了如何使用三种不同的方式在 Typescript 中计算数组元素的出现次数。这些方法都可以在大多数情况下工作,但是它们的效率和适用性是不同的。选择哪种方法取决于你的要求。希望这篇文章对你有所帮助!