微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决减少表情符号对象数组以获取每个表情符号javascript的计数

我有一个如下的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.valuesArray.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 举报,一经查实,本站将立刻删除。