函数式
一、函数式编程的出现
- 发展历程:命令(脚本)式 -> 面向对象式 -> 函数式编程
- 使用:lodash ramda
1. 问题的出现 - 从一道面试题开始
- 面试题: 上接浏览器原理 —— 参数 parse
题目:数组在url中展示形式
location.search=>‘?name[]=progressive %coding&name[]=objective %coding&name[]=functional$%coding’
要求:参数提取拼接成数组
[‘progressive %coding', 'objective %coding’, ‘functional$%coding’]
手写方法:转换成数组对象
[{name: ‘Progressive Coding’}, {name: ‘Objective Coding’}, {name: ‘Functional Coding’}
//解决
const _array = ['progressive$%coding', 'objective$%coding', 'functional$%coding'];
const _objArr = [];
const nameParser = (array, objArr) => {
array.forEach(item => {
let names = item.split('$%');
let newName = [];
names.forEach(name => {
let nameItem = name[0].toUpperCase() + name.slice(1);
newName.push(nameItem);
})
objArr.push({
name: newName.join(' ');
});
})
return objArr
}
console.log(nameParser(_array, _objArr));
存在的问题
- 过程中存在逻辑包裹 - 看完整段代码,才能明白在做啥
- 存在临时变量,并且收尾封闭 - 迭代拓展难度高
2. 优化的解决方案
-
需求分析:最根本的需求是: 将数组转换数组对象,即数组中[字符串=>对象]
(['progressive$%coding'] => [{ name: 'Progressive Coding'}])
nameParser => [objHelper : string > object(把string转成对象)]//string > object(把string转成对象)
-
模块功能明确:支撑需求做的子需求,该数组对象由格式化后的字符串,加上对象{}的包裹
objHelper = formatName + assembleObj
-
功能拆分:格式化字符串包括拆分,首字母大写,用空格合并
objHelper = [(split + capitalize + join)] + assembleObj
-
代码实现
- compose从右往左运行
// 输入 const _array = ['progressive$%coding', 'objective$%coding', 'functional$%coding']; // 原子操作 const assembleObj = (key, x) => { let obj = {