项目中需要读取用户填写的表格,用于数据库批量新增记录。由于每一行可能涉及到多个实体的创建,不同实体间存在不同的关系。不过按照从属关系,这些实体间可通过嵌套对象来表示。例如如下表格:
用户名 | 订单号 | 订单发件人 |
---|---|---|
barwe | N1234 | tm |
首先声明一个从表格到数据表字段的映射字典:
const headerToFieldDict = {
用户名: "name",
订单号: "order.num",
订单发件人: "order.sender.name",
}
上述映射字典使用了嵌套字段,嵌套对象间通过.
分隔。读取的单层数据对象应该是这样的:
const flattenUser = {
name: "barwe",
"order.num": "N1234",
"order.sender.name": "tm",
}
根据映射字典定义的嵌套关系转换为嵌套对象如下:
const nestedUser = {
name: "barwe",
order: {
num: "N1234",
sender: {
name: "tm",
}
}
}
通过递归实现转换:
function toNestedObject(flattenData) {
const recursive = (o) => {
const nesting = {}
const subFlattens = {}
_.entries(o).forEach(([k, v]) => {
if (k.includes('.')) {
const arr = /^([^\\.]+)\.(.*)$/.exec(k)
if (!_.has(subFlattens, arr[1])) {
subFlattens[arr[1]] = {}
}
subFlattens[arr[1]][arr[2]] = v
} else {
nesting[k] = v
}
})
_.entries(subFlattens).forEach(([k, v]) => {
nesting[k] = recursive(v)
})
return nesting
}
return recursive(flattenData)
}
评论区