xmind檔案如圖所示,
最終生成的資料結構如圖:

2,選擇匯出為excel檔案,匯出的excel檔案打開如圖
3,安裝node讀取excel模塊 cnpm i node-xlsx --save
4,使用node-xlsx模塊讀取excel檔案,注意檔案名不能為中文,
使用示例
var xlsx2json = require("node-xlsx"); var list = xlsx2json.parse("./test3.xlsx"); 讀取出的excel資料如圖
5,分析該資料結構和實際的excel可以發現,node模塊讀取是按excel一行一行的讀取,未讀取到的就是null,例如,第一行讀取到的
因為第一行中一些單元格合并為了一個,所以node模塊讀取的時候是按照一行讀取的,所以陣列第二項讀取的前四項都為空
接下來是實作將讀取到的陣列轉換為json資料的核心部分,
主要由3個函陣列成
function arrToJson(arr, column) { //將陣列轉換為嵌套的json物件 let MaxLength = arr.length - 1; let deep = {} for (let index = MaxLength; index >= 0; index--) { if (arr[index] === null) { break; } let obj = {}; if (Object.keys(deep).length > 0) { let childArr = [] obj['id'] = String(column) + '_' + String(index) obj['text'] = arr[index] childArr.push(deep) obj['children'] = childArr; deep = obj } else { obj['id'] = String(column) + '_' + String(index) obj['text'] = arr[index] deep = obj } } return deep;} 改函式作用是將每一行中的有效資料轉為具有層級的數形結構,對比node模塊讀取出的資料和excel的資料規律可以發現
每一行資料可以轉化為如圖
嵌套的結構,陣列的長度就是當前行的最大深度,
將最初的陣列的每一項都轉為該結構如圖
6,再次分析node模塊讀取的資料和excel規律可以發現

第二行為個null,代表第一行的前四個資料,因此,只需要將第二行生成的嵌套物件和第一行生成的嵌套物件合并,再將第二行資料和第三行資料合并3->4合并,后邊以此類推即可得到完整的tree,
但是有一個問題,假設同樣有兩個第三級的資料我怎么能知道后一項是插入第三級的哪一項中呢,其實觀察資料的規律不難發現,每次插入的時候只需要獲取當前資料所在項的深度,然后插入到比當前資料深度多一的父級的最后插入當前資料,即可保證插入的層級不會錯誤,
實作代碼如下
function createTree(arr) { //生成最終樹 let renderTree = {} arr=JSON.parse(JSON.stringify(arr)) arr.forEach((element, index) => { let result = arrToJson(element, index); if (Object.keys(renderTree).length > 0) { renderTree = getMergeTree(renderTree, result) } else { renderTree = getMergeTree(result, null) }}); writeJson(renderTree) } function getMergeTree(parentobj, currentobj) { //生成合并的樹 if (currentobj == null) { return parentobj; } let resultObj = {} DFS(parentobj, currentobj);
function DFS(parentobj, currentobj) {
let idNumber; try { idNumber = Number(currentobj.id.split('_')[1]) - 1 } catch (error) { idNumber = -10; }
let child = parentobj.children; if (child !== undefined && child.length > 0) {
let childrenLength = child.length - 1 let parentId = Number(parentobj.id.split('_')[1]) if (parentId == idNumber) { child.push(currentobj) }
DFS(child[childrenLength], currentobj) resultObj = parentobj }
} return resultObj } 該函式是一個DFS搜索演算法,搜索出比當前級大一級的父級物件樹,并且在父級樹的children陣列的最后一項插入當前物件 如圖是前四項生成的json物件和第五項的合并


完整代碼如下:
var xlsx2json = require("node-xlsx"); var list = xlsx2json.parse("./test3.xlsx"); var fs = require("fs") let testarr = [ ['教育心理學', '教育心理學概述', '教育心理學的基本內涵', '研究物件與研究內容', '概念'], [null, null, null, null, '學科性質'], [null, null, null, null, '研究內容', '五要素三程序'], [null, null, null, '教育心理學與普通心理學的關系'], [null, null, null, '教育心理學的作用', '描述'], [null, null, null, null, '解釋'], [null, null, null, null, '預測'], [null, null, null, null, '控制'], [null, null, "教育心理學的發展史", "初創時期", "裴斯泰洛齊"], [null, null, null, null, "赫爾巴特"], [null, null, null, null, "桑代克"], [null, null, null, "發展時期", "小原又一"], [null, null, null, null, "廖世承"], [null, null, null, "成熟時期", "布魯納"], ]createTree(list[0].data)//使用node讀取的陣列資料 // createTree(testarr)//測驗,使用testarr資料可直接查看生成的資料,測驗資料采用真實的一部分資料 // let totalobj={"id":"0_0","text":"教育心理學","children":[{"id":"0_1","text":"教育心理學概述","children":[{"id":"0_2","text":"教育心理學的基本內涵","children":[{"id":"0_3","text":"研究物件與研究內容","children":[{"id":"0_4","text":"概念"}]}]}]}]}
// let resultObj= getMergeTree(totalobj,{"id":"1_4","text":"學科性質"}) // console.log(JSON.stringify(resultObj)); function createTree(arr) { //生成最終樹 let renderTree = {} arr=JSON.parse(JSON.stringify(arr)) arr.forEach((element, index) => { let result = arrToJson(element, index); if (Object.keys(renderTree).length > 0) { renderTree = getMergeTree(renderTree, result) } else { renderTree = getMergeTree(result, null) }
}); writeJson(renderTree) }
function arrToJson(arr, column) { //將陣列轉換為嵌套的json物件 let MaxLength = arr.length - 1; let deep = {} for (let index = MaxLength; index >= 0; index--) { if (arr[index] === null) { break; } let obj = {}; if (Object.keys(deep).length > 0) { let childArr = [] obj['id'] = String(column) + '_' + String(index) obj['text'] = arr[index] childArr.push(deep) obj['children'] = childArr; deep = obj } else { obj['id'] = String(column) + '_' + String(index) obj['text'] = arr[index] deep = obj } } return deep;
}
function getMergeTree(parentobj, currentobj) { //生成合并的樹 if (currentobj == null) { return parentobj; } let resultObj = {} DFS(parentobj, currentobj);
function DFS(parentobj, currentobj) {
let idNumber; try { idNumber = Number(currentobj.id.split('_')[1]) - 1 } catch (error) { idNumber = -10; }
let child = parentobj.children; if (child !== undefined && child.length > 0) {
let childrenLength = child.length - 1 let parentId = Number(parentobj.id.split('_')[1]) if (parentId == idNumber) { child.push(currentobj) }
DFS(child[childrenLength], currentobj) resultObj = parentobj }
} return resultObj }
function writeJson(arrlist) { fs.writeFile('person.json', JSON.stringify(arrlist), function (err) { if (err) { console.error(err); } console.log('----------新增成功-------------'); }) }
博客地址:https://www.cnblogs.com/zzh965390267
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/163656.html
標籤:JavaScript
上一篇:git中的SSL certificate problem: unable to get local issuer certificate錯誤的解決辦法
