当前位置: 首页 > news >正文

前端 JS 经典:通用性函数封装思路

前言:设计通用性函数,我们需要考虑两个方面,一个是函数传参的可能性,如果可能性很多,我们可以将处理参数的方法暴露出去,让使用者去设计。为了调用的方便性,我们还可以做参数的归一化

举个例子:有一个 people 数组如下,现在需要开发者给这个数组按 sex 分组。man 的一组,woman 的一组。

const people = [{ name: "a", age: 1, sex: "man" },{ name: "b", age: 2, sex: "woman" },{ name: "c", age: 3, sex: "man" },{ name: "d", age: 4, sex: "man" },{ name: "e", age: 1, sex: "woman" },{ name: "f", age: 1, sex: "man" },{ name: "g", age: 1, sex: "man" },{ name: "h", age: 2, sex: "woman" },
];

1. 普通函数的封装

构建一个函数,传入两个参数,数组和决定分组的 key。

这样看着还挺好,但是有个问题,就是这个函数的局限性。我们只能确定我们第一个传入的是数组,但是我们不能确定数组里面的项是什么,这个函数就固定了传入的数组必须是对象数组,且第二个参数,必须是对象里的属性,这个函数才能生效。

const groupBy = (arr, key) => {let result = {};arr.forEach((item) => {const _key = item[key];if (result[_key]) {result[_key].push(item);} else {result[_key] = [item];}});return result;
};

2. 公共函数的封装

构建一个函数,功能和上面那个一样。

但是这个函数将第二个参数暴露给了开发人员,开发人员需要按照什么形式分组,都可以自己定义,而且我们也做了参数的归一化,如果第二个参数没有传回调函数,而是传的字符串,我们可以将这个字符串,在函数的内部转换成回调函数。就相当于开发者还是传入的回调函数。

const groupBy = (arr, callback) => {if (typeof callback === "string") {const keyName = callback;callback = (item) => item[keyName];}let result = {};arr.forEach((item, index) => {const _key = callback(item, index, arr);if (result[_key]) {result[_key].push(item);} else {result[_key] = [item];}});return result;
};

用公共函数,我们实现按 "性别-年龄" 的形式完成分组

groupBy(people, (item) => `${item.sex}-${item.age}`);

相关文章:

  • 常见的创建型设计模式( 一 )
  • 数据结构之探索“队列”的奥秘
  • vue elementui table给表格中满足条件的每一条记录添加计时器
  • 低代码平台框架:开源选型、实践与应用深度解析
  • C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍
  • ThreadLocal的原理
  • 深入浅出简单工厂模式及其在 Spring 框架中的应用
  • 【专业英语 复习】第9章 Privacy, Security,and Ethics
  • 【Flask】学习
  • 丰臣秀吉-读书笔记六
  • 沙奇里再造世界波,容声注定与经典结缘
  • 如何验证证书的合法性
  • MaxWell实时监控Mysql并把数据写入到Kafka主题中
  • Linux下VSCode的安装和基本使用
  • 数组和链表的区别是什么?
  • 网络传输文件的问题
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • ES6指北【2】—— 箭头函数
  • 【前端学习】-粗谈选择器
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Cookie 在前端中的实践
  • Flannel解读
  • IDEA常用插件整理
  • JavaScript HTML DOM
  • JS专题之继承
  • linux学习笔记
  • Theano - 导数
  • vagrant 添加本地 box 安装 laravel homestead
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 动态魔术使用DBMS_SQL
  • 技术胖1-4季视频复习— (看视频笔记)
  • 简单基于spring的redis配置(单机和集群模式)
  • 马上搞懂 GeoJSON
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端之Sass/Scss实战笔记
  • 入口文件开始,分析Vue源码实现
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微服务核心架构梳理
  • 详解NodeJs流之一
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • - 转 Ext2.0 form使用实例
  • Python 之网络式编程
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • # SpringBoot 如何让指定的Bean先加载
  • #if等命令的学习
  • #Java第九次作业--输入输出流和文件操作
  • #java学习笔记(面向对象)----(未完结)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $jQuery 重写Alert样式方法
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (实战篇)如何缓存数据
  • (译) 函数式 JS #1:简介
  • (转)甲方乙方——赵民谈找工作