减少表情符号对象数组以获得每个表情符号的数量 javascript

Reduce array of emoji objects to get count of each emoji javascript

我有一个 javascript 数组如下:

[
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
    {moodSymbol: ""},
]

我怎样才能得到每个表情符号的数量并仍然保持 moodSymbol 键名不变:

const data = [
{
    moodSymbol: "",
    count: 3
},
{
    moodSymbol: "",
    count: 2
}, 
...
]

我也想要 前 5 个最高的。我尝试使用 reduce,但老实说,我在使用 emojis 时遇到了很多麻烦。

const result = Array.from(data.reduce((acc,{ moodSymbol: emoji }) => {
  const count = acc.get(emoji) || 0
  acc.set(emoji, count + 1)
  return acc
}, new Map()).entries()).map(([moodSymbol, count]) => ({ moodSymbol, count }))

如果你想要前 5 名,你可以按 count 排序然后切掉 5.

您可以创建一个对象(哈希映射)来计算每个符号,然后生成结果数组。

要获得前5名,只需将结果按降序排序,然后将数组拼接为只有5个元素即可。

let arr = [ {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}, {moodSymbol: ""}];

let obj = {};

arr.forEach(e => {
    obj[e.moodSymbol] = obj[e.moodSymbol] || 0;
    obj[e.moodSymbol]++;
});

let res = Object.entries(obj).map(e => ({moodSymbol: e[0], count: e[1]}));

res.sort((a, b) => b.count - a.count).splice(5);

console.log(res);

const symbols = [
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" },
  { moodSymbol: "" }
];

const result = symbols.reduce((acc, curr) => {
  const oldCountIndex = acc.findIndex(
    (old) => old.moodSymbol === curr.moodSymbol
  );

  if (oldCountIndex > -1) {
    acc[oldCountIndex].count++;
  } else {
    acc.push({ moodSymbol: curr.moodSymbol, count: 1 });
  }

  return acc;
}, []);

console.log(result);

下面是使用 Array.reduceObject.valuesArray.sort 最后 Array.slice.

的方法
  • Object.values,为了将Array.reduce返回的最终结果转化为数值数组。每个对象由 moodSymbolcount 属性组成
  • Array.sort为了数组降序排列
  • Array.slice 以便从最终排序的数组中获取前 5 项。

let data = [{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""},{moodSymbol:""}];

const getTop5 = (data) => {
  const finalRes = data.reduce((res, {moodSymbol}) => {
    res[moodSymbol] = {
      moodSymbol,
//Incrementing the count by 1, when matched `moodSymbol` found in the result object.
      count: (res[moodSymbol]?.count || 0) + 1
    };
    return res;
  }, {})
  return Object.values(finalRes).sort((a1, a2) => a2.count-a1.count).slice(0, 5);
}

console.log(getTop5(data))
.as-console-wrapper {
  max-height: 100% !important;
}

我建议将数组缩减为一个以表情符号作为键并以计数作为值的对象。然后您可以将该对象的条目映射回数组。

const counts = Object.entries(
 // reduce the array to an object. if you find an existing entry of your emoji, 
 // add one unit to value (count). otherwise, add a new entry with a value of 1
 symbols.reduce((a, { moodSymbol: s }) => ((a[s] = (a[s] || 0) + 1), a), {})
// get the entries of that object and map it back into an array of objects,
// with the key (emoji) as the `moodSymbol`, and the value (count) as the `count`
).map((e) => ({ moodSymbol: e[0], count: e[1] }));

要获得前五名,您应该按 count 属性 对数组进行排序,然后切掉前五名以外的所有内容。

const symbols = [
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" },
{ moodSymbol: "" }
];

const counts = Object.entries(
 symbols.reduce((a, { moodSymbol: s }) => ((a[s] = (a[s] || 0) + 1), a), {})
).map((e) => ({ moodSymbol: e[0], count: e[1] }));

const topFive = counts.sort((a, b) => b.count - a.count).slice(0, 5);

console.log(counts);
console.log(topFive);