我应该选择MAP还是REDUCE?

时间:2018-11-01 11:12:50

标签: javascript ecmascript-6 reduce

在这种情况下,我必须将电子邮件列表的格式设置为JSON,而mapreduce函数都可以完成这项工作,但是我很困惑,应该使用哪一个,还是有其他选择?

输入

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 个答案:

答案 0 :(得分:1)

一些想法:

1)如果您.map告诉编译器(和您的同事)一个数组,该数组的每个元素都应转换为其他元素,然后将结果收集到一个新数组中。

2)如果您.reduce一个数组告诉编译器(和您的同事)该数组的所有元素都被转换为新值(是的,可能是一个数组)。

3)您可以用.map重写每个.reduce,但不能用.reduce重写.map(至少不是很漂亮)。

因此,我想说.map更清楚地表达了您的意图。就像喜欢“我买车”而不是“我要买正在行驶的有四个车轮和一个发动机的汽车”一样。虽然两者含义相同,但第一个更容易理解。

相关问题