以功能方式解析结构化数据(例如,不改变)
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'
],
...
}
在不改变 groups
和 currentGroup
的情况下,以纯函数方式实现此目标的最佳方法是什么?我是否需要更仔细地研究 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中没有合理的方法来创建一个没有变异的地图对象。只要您将 属性 作业保存在本地,就没有问题。
假设您的文件中有以下数据:
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'
],
...
}
在不改变 groups
和 currentGroup
的情况下,以纯函数方式实现此目标的最佳方法是什么?我是否需要更仔细地研究 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中没有合理的方法来创建一个没有变异的地图对象。只要您将 属性 作业保存在本地,就没有问题。