此问题已在此处有答案:
Counting the occurrences / frequency of array elements(41答案)
15小时前关门了。
我需要迭代一个字符串数组,计算每个字符串的出现次数,并返回一个包含值和出现次数的对象。
我试图使用数组reduce函数来实现这样的事情,但是,尽管尝试了,我还没有能够实现这一点。
所以我有以下内容:
["tony", "tony", "tony", "tony", "kassandra", "tony", "tony", "kassandra"]
我需要输出:
[{ name: "tony", matches: 6 }, { name: "kassandra", matches: 2 }]
我应该使用什么来获得上述输出?
我尝试了以下方法:
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;
});
3条答案
按热度按时间l7wslrjt1#
首先,计算数组中每个名称的出现次数。
其次,将其转换为具有所需格式
name
及其matches
的对象。如果你想使用
.reduce()
方法来计算名字的出现次数:另一种使用
Object.entries()
将示例转换回对象的方法两种方法相结合:
yfjy0ee72#
要获得所需的输出,可以使用reduce函数沿着一个对象来存储每个名称的计数。下面是一个如何实现它的示例:
输出:
在上面的代码中,
reduce
函数用于迭代nameList
数组。accumulator(acc
)是一个跟踪每个名称的计数的对象。如果当前名称(curr
)已作为属性存在于累加器中,则计数将递增1。否则,将创建一个新属性,并将名称作为键,初始计数为1。在
reduce
操作之后,我们使用Object.entries
将对象转换回键值对数组。然后,我们使用map
将每个键值对转换为具有name
和matches
属性的对象。最后,结果存储在result
变量中。注意:在您尝试的代码中,您使用相等运算符(
==
)比较p
和c
,该运算符只比较值,而不比较出现次数。此外,您没有处理名称与前一个名称不相等的情况。trnvg8h33#
一个纯
Array::reduce()
Typescript解决方案。我们提供了一个聚合对象(回调中的
r
),其中存储了2个值:结果数组arr
与所需的输出和Mapmap
,我们可以很容易地找到一个现有的数组项,以增加找到的匹配:A live typescript gist is here.
JS版本:
还有一个基准: