Javascript 以功能方式解析结构化数据(例如,不进行变异)

Javascript 以功能方式解析结构化数据(例如,不进行变异),javascript,algorithm,parsing,functional-programming,immutability,Javascript,Algorithm,Parsing,Functional Programming,Immutability,假设文件中包含以下数据: Group1 Thing1 Thing2 Group2 Thing1 Thing2 Thing3 Group3 Group4 Thing1 编写一个“解析器”很容易,它逐行遍历文件,记住当前的组(在一个变量中),然后将所有的东西写入一个对象,并按它们各自的组整齐地分组: // Very naive implementation for illustrative purposes only let groups = {} let currentG

假设文件中包含以下数据:

Group1
  Thing1
  Thing2
Group2
  Thing1
  Thing2
  Thing3
Group3
Group4
  Thing1
编写一个“解析器”很容易,它逐行遍历文件,记住当前的
(在一个变量中),然后将所有的
东西
写入一个对象,并按它们各自的组整齐地分组:

// 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'
  ],
  ...
}

在不改变
当前组
的情况下,实现这一点的最佳方法是什么?我是否需要更仔细地研究一下数组。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中没有合理的方法来创建一个没有变异的map对象。只要你将你的财产分配保持在本地,那就没什么错。

不变异意味着什么?你需要在某个地方对以下部分进行分组。我说的不是改变现有的值,而是创建修改过的副本,这是函数式编程范例的典型。例如,让person={name:'Nina'}代替
;person.lastName='Scholz'
,我更喜欢
constperson={name:'Nina'};const personNew=Object.assign({},person,{lastName:'Scholz'})
您可以通过递归轻松实现这一点。但是,当前引擎没有针对递归进行优化(没有TCO)。所以你最好坚持建议的解决方案。谢谢!我只是想知道是否有更好的选择来代替当地的任务。