前言
有一组数据,最外层为数组类型[],其中数组中每个对象{}包含人员姓名,所在部门,部门层级。
例如:originData.json原始数据中
[
{
"name": "张三",
"unit": "事业部门A",
"team": "事业部门A/事业部门A1/事业部门A1-1"
},
{
"name": "李四",
"unit": "事业部门B",
"team": "事业部门B/事业部门B1"
},
{
"name": "王五",
"unit": "事业部门A",
"team": "事业部门A/事业部门A2"
},
{
"name": "赵六",
"unit": "事业部门A",
"team": "事业部门A/事业部门A1/事业部门A1-1"
},
...
]
则数据处理之后为:最外层为对象类型 {},部门分层级数据类型也是对象类型 {},最后相同子部门的人员姓名统计在一起,且数据类型为数组类型[]。
resultData.json 完成数据中
{
"事业部门A": {
"事业部门A1": {
"事业部门A1-1": [
"张三",
"赵六"
]
},
"事业部门A2": [
"王五"
]
},
"事业部门B": {
"事业部门B1": [
"李四"
]
},
...
}
思想方式
通过两层循环来实现,一层将数据中每个对象遍历; 一层根据对象中 team 数据遍历。
1. 先将数据获取,并循环遍历
const originData = require('./originData.json')
// 获取数据中人员姓名
var nameData = originData[i].name
// 数据循环遍历,获取数据中每条对象
for (let i = 0; i < originData.length; i++) {}
2. 将数据中 team 部门层级通过 split 分割
var teamData = originData[i].team.split("/")
3. 根据部门层级循环遍历
for (j = 0; j < teamData.length - 1; j++) {}
这里只判断部门层级倒数第二层,数据类型为{},最后一层为子部门数据类型为[]
3. 通过对象属性判断值是否存在
if (temp[teamData[j]] === undefined) {
temp[teamData[j]] = {}
}
根据对象属性判断值,如果不存在则为undefined,可通过这个方法进行判断。
4. 使用中间变量 temp
通过中间变量 temp 引用,防止结果 resultData 在数据处理的过程中覆盖原始数据。
实现
// 获取原始数据 originData
const originData = require('./originData.json')
const fs = require('fs')
// 结果数据 resultData
var resultData = {}
/**
* 两层循环: 一层将数据中每个对象遍历; 一层根据对象中 team 数据遍历
* @param {array} teamData 每层数据中的 team
* @param {string} nameData 每层数据中的 name
* @param temp 中间变量, 变量引用
*/
function trans() {
for (let i = 0; i < originData.length; i++) {
var teamData = originData[i].team.split("/")
var nameData = originData[i].name
let temp = resultData
var j;
for (j = 0; j < teamData.length - 1; j++) {
// 对外->内层数据判断处理并设类型为 {}
if (temp[teamData[j]] === undefined) {
temp[teamData[j]] = {}
}
temp = temp[teamData[j]]
}
// 对最后一层数据判断处理并设类型为 []
if (temp[teamData[j]] === undefined) {
temp[teamData[j]] = [nameData]
// 表示已经存在数据, 将现有数据 push 插入
} else {
temp[teamData[j]].push(nameData)
}
}
console.log(resultData)
}
trans()
fs.writeFile(__dirname+'/resultData.json',JSON.stringify(resultData),err=>{
console.log('ok')
})
总结
在开始,我思考将数据从内往外读取的方式进行处理,但是没有想到如何将数据层级之间进行处理,花费了一些时间。
以上仅为个人实现的一种方法,会有其他方法例如递归实现等,仅记录个人学习的过程。