如何将 javascript 字符串数组减少为唯一值但计算重复项的数量?

How do I reduce a javascript string array to unique values but keep count of the number of duplicates?

我有一个包含许多字符串的数组,例如:

["e", "e", "e", "e", "a", "e", "e", "a", "e", "e", "e", "e", "e", "o", "a", "e", "r", "e", "e", "e", "o", "e", "u"]

现在我想减少这个数组,让它只包含唯一的字符串。同时,我想计算重复项的数量并(最好)计算一个百分比,该百分比显示重复项数除以字符串总数。

我在想一个看起来像这样的最终结果:

[
    {
        letter: "e",
        duplicates: 16,
        percentage: 0.695652173913043
    },
    {
        letter: "a",
        duplicates: 3,
        percentage: 0.130434782608696
    },
    {
        letter: "o",
        duplicates: 2,
        percentage: 0.08695652173913
    },
    {
        letter: "r"
        duplicates: 1,
        percentage: 0.043478260869565
    },
    {
        letter: "u",
        duplicates: 1,
        percentage: 0.043478260869565
    }
]

我将如何在 JavaScript/ES6 中进行此转换?

这可以通过使用 Array#from, Array#reduce, Map, Array#map, and destructuring 来实现。

reduce 允许重新组合和计算字母及其出现次数。 一旦它们被正确组织,您就可以继续绘制所有结果并计算百分比。

const data = ["e", "e", "e", "e", "a", "e", "e", "a", "e", "e", "e", "e", "e", "o", "a", "e", "r", "e", "e", "e", "o", "e", "u"];

const res = Array
  .from(data.reduce((acc, cur) => acc.set(cur, (acc.get(cur)||0) + 1), new Map()))
  .map(([letter, duplicates]) => ({letter, duplicates, percentage: duplicates / data.length}));
  
 console.log(res);

let array = ["e", "e", "e", "e", "a", "e", "e", "a", "e", "e", "e", "e", "e", "o", "a", "e", "r", "e", "e", "e", "o", "e", "u"]


let result = [...new Set(array)].map(e =>({letter:e,
duplicates:array.filter(n => n===e).length,
percentage:array.filter(n => n===e).length/array.length}))


console.log(result)