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 }) {
) return [];
) 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]
}));
// 临时引用
; i ) {
tempMap[data[i][key]] = data[i];
}
// 叶子通过临时引用挂载,利用所有的节点都是单例,才可以通过临时引用去挂载叶子
// 根元素直接push到根节点
; i ) {
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,数组转树的更多相关文章

  1. 七、Delphi10.3读取JSON数组

    一.Delphi读取JSON数组是非常方便的,首先我们网上找一段JSON数据 { "error": 0, "status": "success&quo ...

  2. Jackson将json string转为Object,org.json读取json数组

    从json文件读取json string或者自定义json string,将其转为object.下面采用的object为map,根据map读取json的某个数据,可以读取第一级的数据name,后来发现 ...

  3. nodejs读取json文件,写入mongodb数据库

    最近又一点时间,开始使用mongodb存储json模型文件,然后可以实现模型文件的在线编辑和管理.今天上午实现了json文件入库的代码,如下: var fs=require("fs" ...

  4. 遍历json数组实现树

    今天小颖在工作中遇到要遍历树得问题了,实现后,怕后期遇到又忘记啦,所以记录下嘻嘻,其实这个和小颖之前写过得一篇文章    json的那些事    中第4点有关json的面试题有些类似. 数组格式: v ...

  5. C# Json数组序列化和反序列总结

    1.创建json数组,例: JArray arrFile = new JArray(); arrFile.Add(new JObject() { new JProperty("FilePat ...

  6. 【Spring学习笔记-MVC-6】SpringMVC 之@RequestBody 接收Json数组对象

    作者:ssslinppp       1. 摘要 程序流程: 前台使用ajax技术,传递json字符串到后台: 后台使用Spring MVC注解@RequestBody 接受前台传递的json字符串, ...

  7. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  8. Java学习笔记-文件读写和Json数组

    Java文件读写 Java中I/O流对文件的读写有很多种方法,百度后主要看了以下三种 第一种方式:使用FileWriter和FileReader,对文件内容按字符读取,代码如下 String dir ...

  9. 八、Delphi10.3读取JSON文件,并修改JSON数组一条内容后保存到文件

    一.我们有一个JSON文件,如下: { "在野": [ { "城池": 0, "武将": 74, "登场年": 190 ...

随机推荐

  1. 挑战App Store,微信通过“跳一跳”秀了一下“小程序”的肌肉

    2017年即将结束的时候,微信放了一个大招.随着最新的微信v6.6.1版本更新,基于小程序的"小游戏"板块正式上线.微信上首发的这款"小游戏"叫"跳一 ...

  2. Java JTS & 空间数据模型

    空间数据模型 判断两个几何图形是否存在指定的空间关系.包括: 相等(equals).分离(disjoint).相交(intersect).相接(touches).交叉(crosses).包含于(wit ...

  3. class_copyIvarList方法获取实例变量问题引发的思考

    在runtime.h中,你可以通过其中的一个方法来获取实例变量,那就是class_copyIvarList方法,具体的实现如下: - (NSArray *)ivarArray:(Class)cls { ...

  4. Java之路第一步——第一行Java代码

    main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法. 名字必须是main: 必须是public static void 类型的: 必须接收一 ...

  5. windows日志监控

    bat脚本,主要作用,每个五分钟读取日文本件中新增内容,进行错误赛选,如果有错误信息,将错误信息用邮件发送给管理员. 其中awk和sed需要手动下载 :读取number.txt文档,获取上一次执行时文 ...

  6. AngularJS 模板

    一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器 ...

  7. JDK动态代理[4]----ProxyGenerator生成代理类的字节码文件解析

    通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成 ...

  8. 在linux环境下编译运行OpenCV程序的两种方法

    原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...

  9. sql sever模糊查询和聚合函数

    使用is null 的时候 要确保 查询的列 可以为空! null:  01.标识  空值  02.不是0,也不是空串""  03.只能出现在定义 允许为null的字段  04.只 ...

  10. SpiderMonkey js引擎的静态编译与使用

    原文出处: http://yaolixing.oltag.com/gns-8ABFFE2D-EB1E-44FA-9118-217ED7959536.html 几百KB的跨平台js引擎,是不是您心之所想 ...