merge合并2个json文件

功能

import { expect } from "chai";
import { createMerge } from "./merge";
import { equals } from "ramda";
// 定义合并数组时,判断数组项目是否合并
const merge = createMerge((a, b) => {return equals(a, b);
});
复制代码
import { uniq, keys, dissoc } from "ramda";
import {getType,isNullOrUndefined,isObject,isArray,isString
} from "../util";
export function createMerge(isSame: (a, b) => boolean) {return function merge<T = any>(...sources: T[]) {if (sources.length === 1) {return sources[0];}return sources.reduce((acc, curr) => mergeHelper(acc, curr, isSame), {});};
}function mergeHelper(a, b, isSame) {if (a === b) {return b;}const typeA = getType(a);switch (typeA) {case "array":return mergeArray(a, b, isSame);case "object":return mergeObject(a, b, isSame);case "undefined":return b;case "null":return b;default:if (a === b) {return b;}return mergeDefault(a, b, isSame);}
}
function mergeArray(a: any[], b: any, isSame) {const bType = getType(b);switch (bType) {case "array":// 对比a和b的每一个项目,查看项目的键值是否有相等的const rowLength = a.length;const colLength = b.length;for (let i = 0; i < rowLength; i++) {for (let j = 0; j < colLength; j++) {const equalKeys = getEqualKey(a[i], b[j], isSame);const itema = a[i];const itemb = b[j];if (isString(itema) && isString(itemb)) {if (itema === itemb) {} else if (itema.startsWith(itemb)) {a[i] = itema;delete b[j];break;} else if (itemb.startsWith(itema)) {a[i] = itemb;delete b[j];break;}}if (equalKeys.length > 0) {const result = mergeHelper(itema, itemb, isSame);a[i] = result;delete b[j];break;}}}a = a.filter(res => check(res));b = b.filter(res => check(res));return uniq(a.concat(b));case "null":case "undefined":return a;default:return [...a, b];}
}
function mergeObject(a: object, b: any, isSame) {const bType = getType(b);switch (bType) {case "array":return uniq([a, ...b]);case "object":let result = {};const allKeys = uniq(keys(a).concat(keys(b as object)));if (allKeys.length > 0) {for (let i = 0; i < allKeys.length; i++) {const key: string = allKeys[i];const _keys = key + "s";// a[key] b[keys] `${key}s`if (a[key] && b[_keys]) {a[_keys] = [a[key]];a = dissoc(key, a);}if (b[key] && a[_keys]) {a = dissoc(_keys, a);result = dissoc(_keys, a);}const source = a[key];const target = b[key];if (!isNullOrUndefined(source) || !isNullOrUndefined(target)) {const res = mergeHelper(source, target, isSame);result[key] = res;}}}return result;default:return b;}
}function check(a) {if (isNullOrUndefined(a)) return false;if (isObject(a) || isArray(a)) {return keys(a).length > 0;}return true;
}
function getEqualKey(a, b, isSame): any[] {try {const key = uniq(keys(a).concat(keys(b)));return key.filter(key => {try {const res = isSame([key, toString(a[key])], [key, toString(b[key])]);return res;} catch (e) {return false;}});} catch (e) {return [];}
}function toString(a) {const t = getType(a);switch (t) {case "null":case "undefined":return false;case "string":return a;case "number":return `${a}`;case "boolean":return `${a}`;case "object":return keys(a).map(key => `${key as string}:${toString(a[key])}`).join("\n");default:return a.toString();}
}function mergeDefault(a: string | number | RegExp | boolean, b: any, isSame) {const bType = getType(b);switch (bType) {case "array":return uniq([a, ...b]);case "null":case "undefined":return a;case "string":if ((b as string).startsWith(a as string)) {return b;}if ((a as string).startsWith(b as string)) {return a;}return b;default:return b;}
}
复制代码

merge合并2个json文件相关推荐

  1. Shell Bash 使用jq 命令合并多个json文件以及去掉输出内容里面多余的双引号

    Centos安装 jq命令处理json数据 #安装EPEL源,企业版 Linux 附加软件包(以下简称 EPEL)是一个 Fedora 特别兴趣小组,用以创建.维护以及管理针对企业版 Linux 的一 ...

  2. echarts地图坐标系及多个省份json文件的合并

    安装echarts yarn add echarts 获取省市区数据来源的json文件 datav使用的是高德坐标系,即国测局坐标(GCJ-02).对于GPS,即WSG84坐标系经纬度需要转GCJ-0 ...

  3. 如何修改.json文件的内容?

    以下是项目过程中遇到的一些数据清洗,预处理和统计等常规操作,有需要的可以自行借鉴下相关模块代码,转载或引用请注明. ########################################## ...

  4. Python代码读取Excel(.xlsx)文件并保存JSON文件

    策划需求,要求统计所有xlsx文件中的数据.并将其统一处理归纳到一个文件中,方便阅读. 这时候Python相对C#来说,优势体现出来了.当然C#还是很强的,只是针对某些功能,选择合适的工具. 思路:读 ...

  5. 用python将指定目录下的所有json文件合并成一个csv文件

    #!/usr/bin/env python # -*- encoding: utf-8 -*-import sys import json import os import pandas as pd ...

  6. Echarts合并多省市地图JSON文件方法

    最近在学习用echarts插件进行地图显示,当我想要获取两个或者以上省的一块大地图的时候,发现好像没有可以直接生成的,最后摸索出来了一个比较实用的方法,仅供参考.(以苏皖两省为例) step1:单独下 ...

  7. git 下如何把另外一个分支的某个文件改动merge 合并到这个分支,而不是把整个分支merge过来

    git 下如何把另外一个分支的某个文件改动merge 合并到这个分支,而不是把整个分支merge过来 假设在分支A上改动了一个文件 f ,想把 f 合并到 B上,而不是把整个 A merge  到 B ...

  8. Git分支合并(merge)时忽略某个文件或者目录

    Git分支合并(merge)时忽略某个文件或者目录 前言 ​ 最近使用VUE开发构建了项目,因为打包发布引发了一场小意外,就是不同分支的dist文件夹合并时发生冲突,而且有时先打包后合并的分支,导致两 ...

  9. Lottie—json文件解析

    Lottie主要类图: Lottie对外通过控件LottieAnimationView暴露接口,控制动画. LottieAnimationView继承自ImageView,通过当前时间绘制canvas ...

最新文章

  1. 在线作图|两分钟在线做中性群落模型分析
  2. UltraTextEditor
  3. 《深入理解Java虚拟机》笔记5——类加载机制与字节码执行引擎
  4. Mobile DevOps 之 Proxmox 实现节流提效
  5. COM本质论学习笔记(一)IDL
  6. SAP云平台对Kubernetes的支持
  7. ztree在刷新时第一个父节点消失_第一个关于中式菜谱的智能问答机器人小程序正式上线啦...
  8. 《C++ Primer 4th》读书笔记 第7章-函数
  9. MTK驱动(77)---Android getevent用法
  10. 三月提示:提防挂马网站 关注账号安全
  11. php集成环境、基础标记符
  12. 有可能导致HttpQueryInfo 执行时出现12150 错误的一个原因
  13. 将vue,H5项目打包成app,apk安装包
  14. CH582M,PWM模拟DAC实现WAV播放,FATFS文件
  15. 数据中心服务器芯片温度,【DKV】新建数据中心气流——第二部分:入口温度VS服务器性能...
  16. linux升级gfortran版本,Ubuntu18.04使用配置及gfortran版本的切换
  17. 关于西门子软件SIMIT虚拟在环调试的一些问题解决
  18. Javaweb基础配置模板(mybatis+javaweb)
  19. MyISAM和InnoDB的区别
  20. 《Cloud Native Data Center Network》读书笔记-1

热门文章

  1. 人工智能python框架_Python 与 AI 智能框架 - 随笔分类 - Hopesun - 博客园
  2. android跳转到支付宝扫码,【笔记】通过adb shell启动支付宝扫码登录
  3. mysql事务并发控制_MySQL之事务及并发控制
  4. 无穷级数求和7个公式_考研数学闭关修炼习题讲解(16)无穷级数 附(6)补充解释
  5. mysql数据库 中文乱码_在CMD中操作mysql数据库出现中文乱码解决方案
  6. anki怎么设置学习计划_打篮球怎么训练弹跳力?NBA经典训练计划值得学习
  7. scala mysql bit_Scala连接mysql数据库
  8. java地铁线路规划_地铁线路规划——简单分析
  9. 编程那么苦,学习那么累,这组漫画可以治愈(慢慢品味)
  10. 朋友圈里的一张组合逻辑图