【笔记】nodejs读取JSON,数组转树
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,数组转树的更多相关文章
- 七、Delphi10.3读取JSON数组
一.Delphi读取JSON数组是非常方便的,首先我们网上找一段JSON数据 { "error": 0, "status": "success&quo ...
- Jackson将json string转为Object,org.json读取json数组
从json文件读取json string或者自定义json string,将其转为object.下面采用的object为map,根据map读取json的某个数据,可以读取第一级的数据name,后来发现 ...
- nodejs读取json文件,写入mongodb数据库
最近又一点时间,开始使用mongodb存储json模型文件,然后可以实现模型文件的在线编辑和管理.今天上午实现了json文件入库的代码,如下: var fs=require("fs" ...
- 遍历json数组实现树
今天小颖在工作中遇到要遍历树得问题了,实现后,怕后期遇到又忘记啦,所以记录下嘻嘻,其实这个和小颖之前写过得一篇文章 json的那些事 中第4点有关json的面试题有些类似. 数组格式: v ...
- C# Json数组序列化和反序列总结
1.创建json数组,例: JArray arrFile = new JArray(); arrFile.Add(new JObject() { new JProperty("FilePat ...
- 【Spring学习笔记-MVC-6】SpringMVC 之@RequestBody 接收Json数组对象
作者:ssslinppp 1. 摘要 程序流程: 前台使用ajax技术,传递json字符串到后台: 后台使用Spring MVC注解@RequestBody 接受前台传递的json字符串, ...
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...
- Java学习笔记-文件读写和Json数组
Java文件读写 Java中I/O流对文件的读写有很多种方法,百度后主要看了以下三种 第一种方式:使用FileWriter和FileReader,对文件内容按字符读取,代码如下 String dir ...
- 八、Delphi10.3读取JSON文件,并修改JSON数组一条内容后保存到文件
一.我们有一个JSON文件,如下: { "在野": [ { "城池": 0, "武将": 74, "登场年": 190 ...
随机推荐
- async和enterproxy控制并发数量
聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...
- CSS篇(上)
紧接着HTML篇的CSS篇开啦,老铁们快来围观... 1.介绍一下标准的CSS盒子模型?低版本IE的盒子模型有什么不同? 1>有两种:IE盒子模型 W3C盒子模型 2>盒模型:内 ...
- 程序员的自我救赎---11.1:RPC接口使用规范
<前言> (一) Winner2.0 框架基础分析 (二)PLSQL报表系统 (三)SSO单点登录 (四) 短信中心与消息中心 (五)钱包系统 (六)GPU支付中心 (七)权限系统 (八) ...
- 入门级Nginx反向代理nodejs
本着想实现前后端分离开发的初衷,我决定学习一下关于nignx反向代理的配置. 1.下载Nginx稳定版本 2.打开nginx配置文件 nginx.conf: 3.在http模块的server部分配置 ...
- 外卖app的header组件开发
1.webpack框架创建 # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpa ...
- 学习Object.assign()
Object.assign()用于将所有可枚举的值从一个或多个源对象复制到目标对象.它将返回目标对象. 语法 Object.assign(target, ...source); var obj = { ...
- 详细的DedeCMS(织梦)目录权限安全设置教程
一.目录权限根据统计,绝大部分网站的攻击都在根目录开始的,因此,栏目目录不能设置在根目录.DEDECMS部署完成后,重点目录设置如下:1)将install删除.2) data.templets.upl ...
- java 快速排序
快速排序比插入排序快了两个数量级 package test.sort; public class Paixu { public static void main(String[] args) { // ...
- 2.移植uboot-添加2440单板,并实现NOR、NAND启动
上章分析了uboot启动流程后,接下来便来配置新的单板,实现nor.nand启动 1.首先在uboot里新建单板2440 : cd board/samsung/ cp smdk2410 smdk244 ...
- Golang fmt包使用小技巧
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; te ...