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)。所以你最好坚持建议的解决方案。谢谢!我只是想知道是否有更好的选择来代替当地的任务。