减少表情符号对象数组以获得每个表情符号的数量 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.reduce
、Object.values
、Array.sort
最后 Array.slice
.
的方法
Object.values
,为了将Array.reduce
返回的最终结果转化为数值数组。每个对象由 moodSymbol
和 count
属性组成
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);
我有一个 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.reduce
、Object.values
、Array.sort
最后 Array.slice
.
Object.values
,为了将Array.reduce
返回的最终结果转化为数值数组。每个对象由moodSymbol
和count
属性组成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);