以功能方式解析结构化数据(例如,不改变)

Parsing structured data in a functional way (e.g. without mutating)

假设您的文件中有以下数据:

Group1
  Thing1
  Thing2
Group2
  Thing1
  Thing2
  Thing3
Group3
Group4
  Thing1

很容易写一个 "parser" 逐行循环文件,记住当前的 Group (在一个变量中)然后写所有的 Thing到一个对象,按各自的组整齐地分组:

// Very naive implementation for illustrative purposes only
let groups = {}
let currentGroup = null
data
  .split(/\n/)
  .forEach(entry => {
    const matches = entry.match(/^(Group\d+)$/)
    if (matches) {
      currentGroup = matches[1]
      groups[currentGroup] = []
    } else {
      groups[currentGroup].push(entry.trim())
    }
  })

这给了我:

{
  Group1: [
    'Thing1', 'Thing2'
  ],
  Group2: [
    'Thing1', 'Thing2', 'Thing3'
  ],
  ...
}

在不改变 groupscurrentGroup 的情况下,以纯函数方式实现此目标的最佳方法是什么?我是否需要更仔细地研究 Array.reduce,因为我已经看到一些(恕我直言,相当令人难以置信的)用例将数组转换为对象,或者这对这里没有帮助吗?

是的,您需要在此处使用 reduce

data
.split(/\n/)
.reduce(({groups, currentGroup}, entry) => {
  const matches = entry.match(/^(Group\d+)$/)
  if (matches) {
    groups[matches[1]] = []
    return {currentGroup: matches[1], groups};
  } else {
    groups[currentGroup] = groups[currentGroup].concat([entry.trim()]);
    return {currentGroup, groups};
  }
}, {groups: {}, currentGroup: null})
.groups

但是,JS中没有合理的方法来创建一个没有变异的地图对象。只要您将 属性 作业保存在本地,就没有问题。