1. 程式人生 > >【筆記】nodejs讀取JSON,數組轉樹

【筆記】nodejs讀取JSON,數組轉樹

當前 執行 children ont ## font 常量 return lac

const fs = require(‘fs‘);

// --------------- 讀取源文件 ---------------
const originData = require(‘./vuxArea3.json‘);

// --------------- 常量 ---------------
const constant = {
  ARRAY_TYPE: ‘Array‘,
  JSON_TYPE: ‘Json‘,
};

// --------------- 轉換的配置 ---------------

const config = {
  originKey: {
    children: 
null, parent: ‘parent‘, value: ‘value‘, label: ‘name‘ }, originType: constant.ARRAY_TYPE, targetKey: { children: ‘children‘, parent: null, value: ‘value‘, label: ‘label‘ }, targetType: constant.JSON_TYPE }; // --------------- 轉換函數 --------------- function convertArrayToJson(initData, { originKey, targetKey }) {
if (!initData || initData.length === 0) return []; if (!initData.length === 1) return initData; if (!(initData instanceof Array)) return [initData]; const result = []; const tempMap = []; const key = originKey.value; const parentKey = originKey.parent; const l = initData.length; let i;
// key轉換 const data = initData.map(item => ({ [originKey.parent]: item[originKey.parent], [targetKey.value]: item[originKey.value], [targetKey.label]: item[originKey.label] })); // 臨時引用 for (i = 0; i < l; i += 1) { tempMap[data[i][key]] = data[i]; } // 葉子通過臨時引用掛載,利用所有的節點都是單例,才可以通過臨時引用去掛載葉子 // 根元素直接push到根節點 for (i = 0; i < l; i += 1) { const parentValue = data[i][parentKey]; // 當前元素存在父元素,並且子不等於父 if (tempMap[parentValue] && data[i][key] !== parentValue) { // 父元素上在children上加上當前元素 tempMap[parentValue][targetKey.children] = tempMap[parentValue][targetKey.children] || []; tempMap[parentValue][targetKey.children].push(data[i]); } else { // 當前元素是根元素 result.push(data[i]); } } return result; } function convert(data, { originKey, originType, targetKey, targetType }) { if (originType === constant.ARRAY_TYPE && targetType === constant.JSON_TYPE) { return convertArrayToJson(data, { originKey, targetKey }); } return []; } // --------------- 執行 --------------- const result = convert(originData, config); let resultStr = ‘‘; try { resultStr = JSON.stringify(result); } catch (e) { console.log(e); } resultStr = resultStr.replace(/"parent":"[a-zA-Z\d]+",/g, ‘‘); // --------------- 寫入 --------------- fs.writeFile(‘./result.json‘, resultStr, ‘utf-8‘, (err) => { if (err) { console.log(err); } else { console.log(`### conver ${config.originType} to ${config.targetType} success! `); } });

const fs = require(‘fs‘);
// --------------- 讀取源文件 --------------- const originData = require(‘./vuxArea3.json‘);
// --------------- 常量 --------------- const constant = { ARRAY_TYPE: ‘Array‘, JSON_TYPE: ‘Json‘, };
// --------------- 轉換的配置 ---------------
const config = { originKey: { children: null, parent: ‘parent‘, value: ‘value‘, label: ‘name‘ }, originType: constant.ARRAY_TYPE, targetKey: { children: ‘children‘, parent: null, value: ‘value‘, label: ‘label‘ }, targetType: constant.JSON_TYPE };

// --------------- 轉換函數 --------------- function convertArrayToJson(initData, { originKey, targetKey }) { if (!initData || initData.length === 0) return []; if (!initData.length === 1) return initData; if (!(initData instanceof Array)) return [initData];
const result = []; const tempMap = [];
const key = originKey.value; const parentKey = originKey.parent; const l = initData.length; let i;
// key轉換 const data = initData.map(item => ({ [originKey.parent]: item[originKey.parent], [targetKey.value]: item[originKey.value], [targetKey.label]: item[originKey.label] }));
// 臨時引用 for (i = 0; i < l; i += 1) { tempMap[data[i][key]] = data[i]; }
// 葉子通過臨時引用掛載,利用所有的節點都是單例,才可以通過臨時引用去掛載葉子 // 根元素直接push到根節點 for (i = 0; i < l; i += 1) { const parentValue = data[i][parentKey]; // 當前元素存在父元素,並且子不等於父 if (tempMap[parentValue] && data[i][key] !== parentValue) { // 父元素上在children上加上當前元素 tempMap[parentValue][targetKey.children] = tempMap[parentValue][targetKey.children] || []; tempMap[parentValue][targetKey.children].push(data[i]); } else { // 當前元素是根元素 result.push(data[i]); } } return result; }
function convert(data, { originKey, originType, targetKey, targetType }) { if (originType === constant.ARRAY_TYPE && targetType === constant.JSON_TYPE) { return convertArrayToJson(data, { originKey, targetKey }); } return []; }
// --------------- 執行 --------------- const result = convert(originData, config); let resultStr = ‘‘; try { resultStr = JSON.stringify(result); } catch (e) { console.log(e); } resultStr = resultStr.replace(/"parent":"[a-zA-Z\d]+",/g, ‘‘);
// --------------- 寫入 --------------- fs.writeFile(‘./result.json‘, resultStr, ‘utf-8‘, (err) => { if (err) { console.log(err); } else { console.log(`### conver ${config.originType} to ${config.targetType} success! `); } });

【筆記】nodejs讀取JSON,數組轉樹