专栏首页向前进【笔记】nodejs读取JSON,数组转树

【笔记】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! `);
  }
});
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! `);
  }
});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【笔记】实现一个简易的Promise

    const PENDING_STATE = "pending"; const FULLFILL_STATE = "fullfilled"; const REJE...

    SmileSmith
  • 最近遇到的兼容性问题和适配问题

    JS: IE: 1、不能添加监听标准事件,添加polyfill initEvent: function initEvent(dom, eventName...

    SmileSmith
  • vue-cli脚手架npm相关文件解读(9)config/index.js

    系列文章传送门: 1、build/webpack.base.conf.js 2、build/webpack.prod.conf.js 3、build/webp...

    SmileSmith
  • Dart 笔记 2 - 变量

    未初始化的变量(即使是数字类型的变量)的值都为 null,因为 Dart 中一切都是对象。

    七适散人
  • Spring Boot 到底是怎么运行的,你知道吗?

    Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目...

    纯洁的微笑
  • 100 Days of SwiftUI —— Day 50:Cupcake Corner (二)

    尽管您会熟悉今天工作的基础知识,但是您仍然会发现有很多新事物。随着我们不断扩大SwiftUI的界限,这将变得尤为普遍——当您的应用程序简单时,一切都会变得容易,...

    韦弦zhy
  • Renato 说全球:2018 年语言行业前景展望播客

    本期内容采编自 Renato & Michael 的播客节目《全球化说》第41期:“Podcast 041: Forecast 2018: What's Ahe...

    企鹅号小编
  • docker实战(9)docker快速安装hbase

    下载镜像 docker pull harisekhon/hbase 运行容器 docker run -ti harisekhon/hbase当你执行成功之后直...

    JKXQJ
  • [计算机视觉论文速递] 2018-03-18

    通知:这篇推文有10篇论文速递信息,涉及人脸表情识别、人脸替换、3D人脸重建、Re-ID、目标检测和目标跟踪等方向 Note:最近一直有童鞋私聊问我,有没有相关...

    Amusi
  • 基于外部ZooKeeper的GlusterFS作为分布式文件系统的完全分布式HBase集群安装指南

    192.168.1.85 hbase85 #hbase-regionserver,zookeeper

    白石

扫码关注云+社区

领取腾讯云代金券