如何解决减少表情符号对象数组以获取每个表情符号javascript的计数
import 'package:Flutter/material.dart';
import 'package:curved_navigation_bar/curved_navigation_bar.dart';
class AccountPage extends StatefulWidget {
@override
_AccountPageState createState() => _AccountPageState();
}
class _AccountPageState extends State<AccountPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,bottomNavigationBar: CurvednavigationBar(
backgroundColor: Theme.of(context).backgroundColor,items: <Widget>[
Icon(Icons.add,size: 30),Icon(Icons.list,Icon(Icons.compare_arrows,],onTap: (index) {
//Handle button tap
},),body: CustomScrollView(
slivers: [
SliverAppBar(
elevation: 0.0,backgroundColor: Theme.of(context).primaryColor,expandedHeight: 220.0,collapsedHeight: 125.0,pinned: true,flexibleSpace: Stack(
children: [
Positioned.fill(
child: Image(
image: Assetimage('assets/images/Red_polygon.jpg'),fit: BoxFit.cover,SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,children: [
Container(
width: double.infinity,child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 32.0,vertical: 16.0,child: Column(
mainAxisAlignment: MainAxisAlignment.end,crossAxisAlignment: CrossAxisAlignment.start,children: [
Text(
"Hello,\nFirsT_NAME!",style: TextStyle(
color: Colors.white,fontSize: 32.0,Container(
height: 16.0,width: double.infinity,decoration: Boxdecoration(
color: Theme.of(context).backgroundColor,borderRadius: new BorderRadius.only(
topLeft: const Radius.circular(40.0),topRight: const Radius.circular(40.0),SliverFillRemaining(
child: Container(
color: Theme.of(context).backgroundColor,child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),child: Column(
children: [
],);
}
}
我如何获得每个表情符号的数量,并仍然保持moodSymbol的键名如此:
[
{moodSymbol: "?"},{moodSymbol: "?"},]
我也希望前5名获得最高的计数。我曾尝试使用reduce,但老实说,让它与表情符号一起使用时遇到了很多麻烦。
解决方法
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: "?"}];
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: "?" }
];
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);
,
下面是使用{
"Name": null,"Age": 12
}
以及{
"Age": 12
}
,Array.reduce
,最后是Object.values
的方法。
-
Array.sort
,为了将Array.slice
返回的最终结果转换为值数组。每个对象都由Object.values
和Array.reduce
属性组成 -
moodSymbol
以便以降序对数组进行排序 -
count
,以便从最终排序的数组中获取前5个项目。
Array.sort
Array.slice
,
我建议将数组简化为一个以表情符号作为键并计数为值的对象。然后,您可以将该对象的条目映射回数组。
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: "?" }
];
const counts = Object.entries(
symbols.reduce((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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。