javascript - MAP vs REDUCE 我应该选择哪个?
问题描述
在这种情况下,我必须将电子邮件列表格式化为JSON
,并且map
和reduce
函数都可以完成这项工作,但我很困惑,我应该使用哪一个,或者有其他选择吗?
输入
const emailList = `
Last name, First name <email@email.com>;
Last name, First name <email@email.com>;
Last name, First name <email@email.com>;
Last name, First name <email@email.com>;
`
使用地图
let formatedList =
emailList.trim()
.split(';')
.map(record => {
let recordObj = {}
const [lastname, firstname, email] = record.split(/\,|\</g).map(r => r.trim())
recordObj['firstname'] = firstname
recordObj['lastname'] = lastname
recordObj['email'] = email
return recordObj
})
使用减少
let formatedList =
emailList.trim()
.split(';')
.reduce((usersObj, record) => {
let formatedUser = {}
let [lastname, firstname, email] = record.split(/\,|\</g).map(r => r.trim())
formatedUser['firstname'] = firstname
formatedUser['lastname'] = lastname
formatedUser['email'] = email
usersObj.push(formatedUser)
return usersObj;
}, [])
输出
[
{
"firstname": "First name",
"lastname": "Last name",
"email": "email@email.com>"
},
{
"firstname": "First name",
"lastname": "Last name",
"email": "email@email.com>"
},
...
]
解决方案
一些想法:
1)如果您.map
的数组告诉编译器(和您的同事)数组的每个元素都应该转换为其他元素,然后将结果收集到一个新数组中。
2)如果您.reduce
的数组告诉编译器(和您的同事)该数组的所有元素都被转换为一个新值(是的,这可能是一个数组)。
3)你可以重写每一个.map
with .reduce
,但你不能写.reduce
with .map
(至少不是以一种漂亮的方式)。
因此,我会说这.map
更清楚地表达了您的意图。这就像更喜欢“我买一辆车”而不是“我买一辆正在行驶的、有四个轮子和一个发动机的汽车”。虽然两者的意思相同,但第一个更容易理解。
推荐阅读
- php - Mysql 在没有 SUBQUERY 的同一查询中使用 GROUP BY 和 SUM(没有 group by)。可能的?
- autodesk-forge - ModelDerivate 的清单缺少 SVF2 的 URN
- ios - iOS 应用安装错误“无法安装此应用,因为无法验证其完整性”
- citrix - Microsoft.Web.WebView2 / .NET Framework 4.8 WinForms 应用程序 + 已发布应用程序运行时错误 (REGDB_E_CLASSNOTREG)
- multithreading - Spark rdd.toDF() 线程安全吗?
- android - 如果从图库中选择图像后,如何设置要查看的图像,调用 onCreate 方法并且它已经在该视图中设置了图像?
- elasticsearch - 弹性搜索查询以获取索引中具有给定值的每 2 条记录之间的顺序差异
- kivy - KivyMD 无法与 PIL 模块一起运行
- docker - 如何防止远程机器访问在主机上运行的 Docker 容器?
- vscode-extensions - 如何在没有 TextMate 的情况下为我的语言着色?