数据处理:将分级部门与人员统计处理

321 阅读2分钟

前言

有一组数据,最外层为数组类型[],其中数组中每个对象{}包含人员姓名,所在部门,部门层级。
例如: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')
})

总结

在开始,我思考将数据从内往外读取的方式进行处理,但是没有想到如何将数据层级之间进行处理,花费了一些时间。
以上仅为个人实现的一种方法,会有其他方法例如递归实现等,仅记录个人学习的过程。