在这种情况下,我必须将电子邮件列表的格式设置为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>"
},
...
]
答案 0 :(得分:1)
一些想法:
1)如果您.map
告诉编译器(和您的同事)一个数组,该数组的每个元素都应转换为其他元素,然后将结果收集到一个新数组中。
2)如果您.reduce
一个数组告诉编译器(和您的同事)该数组的所有元素都被转换为新值(是的,可能是一个数组)。
3)您可以用.map
重写每个.reduce
,但不能用.reduce
重写.map
(至少不是很漂亮)。>
因此,我想说.map
更清楚地表达了您的意图。就像喜欢“我买车”而不是“我要买正在行驶的有四个车轮和一个发动机的汽车”一样。虽然两者含义相同,但第一个更容易理解。