如何计算 TypeScript 中字符串数组中字符串出现的次数?

Vin*_*rdo 3 javascript reduce typescript

我需要迭代一个字符串数组,计算每个字符串的出现次数,并返回一个包含值和出现次数的对象。

我正在尝试使用数组归约函数来实现这样的事情,但是,尽管进行了尝试,但我还无法实现这一点。

所以我有以下内容:

["tony", "tony", "tony", "tony", "kassandra", "tony", "tony", "kassandra"]
Run Code Online (Sandbox Code Playgroud)

我需要输出:

[{ name: "tony", matches: 6 }, { name: "kassandra", matches: 2 }]
Run Code Online (Sandbox Code Playgroud)

我应该使用什么来获得上述输出?

我已经尝试过以下方法:

const names = nameList.map((user) => user.name);

const reduce = names.reduce((p, c) => {
  if (p == c) {
    return { name: p, matches: `idk what put here yet` };
  }
  return c;
});
Run Code Online (Sandbox Code Playgroud)

小智 5

首先,统计数组中每个名称的出现次数。
其次,将其转换为具有所需格式的对象name及其matches.

const names = ["tony", "tony", "tony", "tony", "kassandra", "tony", "tony", "kassandra"];
const counts = {};
//1.
names.forEach(name => {
  if (counts[name]) {
    counts[name] += 1;
  } else {
    counts[name] = 1;
  }
});
//2.
const result = Object.keys(counts).map(name => {
  return {
    name: name,
    matches: counts[name]
  };
});
console.log(result);
Run Code Online (Sandbox Code Playgroud)

如果你想使用.reduce()方法来计算名称的出现次数:

const counts = names.reduce((acc, name) => {
    acc[name] = (acc[name] || 0) + 1;
    return acc;
  }, {});
Run Code Online (Sandbox Code Playgroud)

另一种将事件转换回对象的方法是使用Object.entries()

Object.entries(counts).map(([name, matches]) => ({ name, matches }));
Run Code Online (Sandbox Code Playgroud)

两种方法相结合:

const counts = names.reduce((acc, name) => {
    acc[name] = (acc[name] || 0) + 1;
    return acc;
  }, {});
Run Code Online (Sandbox Code Playgroud)