首页 > 解决方案 > MAP vs 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>"
  },
  ...
]

标签: javascriptecmascript-6reduce

解决方案


一些想法:

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

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

3)你可以重写每一个.mapwith .reduce,但你不能写.reducewith .map(至少不是以一种漂亮的方式)。

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


推荐阅读