获取两个 json 对象的差异

2023-12-20

场景:我想要一个比较两个 JSON 对象的函数,并返回一个包含差异列表的 JSON 对象,如果可能的话还返回更多数据,例如覆盖率指标。

var madrid = '{"type":"team","description":"Good","trophies":[{"ucl":"10"}, {"copa":"5"}]}';
var barca = '{"type":"team","description":"Bad","trophies":[{"ucl":"3"}]}';

如果我跑compare(madrid, barca)返回的对象可能类似于:

{"description" : "Bad", "trophies":[{"ucl":"3"}, {"copa":"5"}]}; 

或者类似的东西,你明白了。

有谁知道这个问题的解决方案?我已经找到一个了plugin http://tlrobinson.net/projects/javascript-fun/jsondiff/#%7B%22d%22:%7B%22a%22:%22%7B%5C%22format%5C%22:%5C%22example%5C%22,%5C%22content%5C%22:%5B%7B%5C%22align%5C%22:%5C%22center%5C%22,%5C%22depth%5C%22:0,%5C%22list%5C%22:false,%5C%22content%5C%22:%5B%7B%5C%22style%5C%22:%7B%5C%22underline%5C%22:1,%5C%22bold%5C%22:2,%5C%22size%5C%22:20,%5C%22italic%5C%22:2,%5C%22color%5C%22:%5C%22FFFFFF%5C%22,%5C%22fontFamily%5C%22:%5C%22Arial%5C%22%7D,%5C%22content%5C%22:%5C%22And%20please,%20feel%20free%20to%20send%20us%20your%20feedback%20and%20comments%20to%20%5C%22%7D,%7B%5C%22style%5C%22:%7B%5C%22underline%5C%22:1,%5C%22bold%5C%22:2,%5C%22size%5C%22:20,%5C%22italic%5C%22:2,%5C%22color%5C%22:%5C%224DC3FF%5C%22,%5C%22fontFamily%5C%22:%5C%22Arial%5C%22%7D,%5C%22content%5C%22:%5C%22hello%20world%5C%22%7D,%7B%5C%22style%5C%22:%7B%5C%22underline%5C%22:1,%5C%22bold%5C%22:2,%5C%22size%5C%22:20,%5C%22italic%5C%22:2,%5C%22color%5C%22:%5C%22FFFFFF%5C%22,%5C%22fontFamily%5C%22:%5C%22Arial%5C%22%7D,%5C%22content%5C%22:%5C%22,%20or%20just%20by%20clicking%20on%20the%20%5C%22%7D,%7B%5C%22style%5C%22:%7B%5C%22underline%5C%22:1,%5C%22bold%5C%22:2,%5C%22size%5C%22:20,%5C%22italic%5C%22:2,%5C%22color%5C%22:%5C%224DC3FF%5C%22,%5C%22fontFamily%5C%22:%5C%22Arial%5C%22%7D,%5C%22content%5C%22:%5C%22feedback%5C%22%7D%5D,%5C%22ordered%5C%22:false%7D%5D,%5C%22version%5C%22:3%7D%22,%22b%22:%22%7B%5C%22format%5C%22:%5C%22example%5C%22,%5C%22version%5C%22:3.1,%5C%22content%5C%22:%5B%7B%5C%22list%5C%22:false,%5C%22depth%5C%22:0,%5C%22ordered%5C%22:false,%5C%22content%5C%22:%5B%7B%5C%22content%5C%22:%5C%22And%20please,%20feel%20free%20to%20send%20us%20your%20feedback%20and%20comments%20to%20%5C%22,%5C%22style%5C%22:%7B%5C%22size%5C%22:20,%5C%22color%5C%22:%5C%22FFFFFF%5C%22,%5C%22name%5C%22:%5C%22Arial%5C%22,%5C%22bold%5C%22:2,%5C%22italic%5C%22:2,%5C%22underline%5C%22:2%7D%7D,%7B%5C%22content%5C%22:%5C%22foo%5C%22,%5C%22style%5C%22:%7B%5C%22size%5C%22:20,%5C%22color%5C%22:%5C%224DC2FF%5C%22,%5C%22name%5C%22:%5C%22Arial%5C%22,%5C%22bold%5C%22:2,%5C%22italic%5C%22:2,%5C%22underline%5C%22:2%7D%7D,%7B%5C%22content%5C%22:%5C%22,%20or%20just%20by%20clicking%20on%20the%20%5C%22,%5C%22style%5C%22:%7B%5C%22size%5C%22:20,%5C%22color%5C%22:%5C%22FFFFFF%5C%22,%5C%22name%5C%22:%5C%22Arial%5C%22,%5C%22bold%5C%22:2,%5C%22italic%5C%22:2,%5C%22underline%5C%22:2%7D%7D,%7B%5C%22content%5C%22:%5C%22feedback%5C%22,%5C%22style%5C%22:%7B%5C%22size%5C%22:20,%5C%22color%5C%22:%5C%224DC2FF%5C%22,%5C%22name%5C%22:%5C%22Arial%5C%22,%5C%22bold%5C%22:2,%5C%22italic%5C%22:2,%5C%22underline%5C%22:2%7D%7D,%7B%5C%22content%5C%22:%5C%22%20button%20up%20above.%5C%22,%5C%22style%5C%22:%7B%5C%22size%5C%22:20,%5C%22color%5C%22:%5C%22FFFFFF%5C%22,%5C%22name%5C%22:%5C%22Arial%5C%22,%5C%22bold%5C%22:2,%5C%22italic%5C%22:2,%5C%22underline%5C%22:2%7D%7D%5D,%5C%22align%5C%22:%5C%22center%5C%22%7D%5D%7D%22%7D%7D,但我想知道是否有其他选择。


可以使用按对象键进行迭代的递归函数。然后使用对象.is https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is测试NaN and null。然后测试第二个对象是否是转换为的类型false like 0, NaN, or null。 列出两个对象的键并将它们连接起来以测试中缺少的键obj1然后迭代它。

当相同的键值之间存在差异时,它存储的值object2和收益。如果两个键值都是对象,则意味着可以递归比较,所以确实如此。

function diff(obj1, obj2) {
    const result = {};
    if (Object.is(obj1, obj2)) {
        return undefined;
    }
    if (!obj2 || typeof obj2 !== 'object') {
        return obj2;
    }
    Object.keys(obj1 || {}).concat(Object.keys(obj2 || {})).forEach(key => {
        if(obj2[key] !== obj1[key] && !Object.is(obj1[key], obj2[key])) {
            result[key] = obj2[key];
        }
        if(typeof obj2[key] === 'object' && typeof obj1[key] === 'object') {
            const value = diff(obj1[key], obj2[key]);
            if (value !== undefined) {
                result[key] = value;
            }
        }
    });
    return result;
}

上面的代码是 BSD 许可的,可以在任何地方使用。

测试链接:https://jsfiddle.net/gartz/vy9zaof2/54/ https://jsfiddle.net/gartz/vy9zaof2/54/

一个重要的观察是,这会将数组转换为对象并比较相同索引位置的值。由于需要额外的复杂性,还有许多其他方法可以比较此函数未涵盖的数组。

编辑 2/15/2019:此答案已更改,以添加新的 ES2017 语法并修复注释中的用例。


这只是一个开始,我还没有测试它,但我从递归的过滤器或比较器函数开始,可以根据需要更改它以获得优先结果。

function filter(obj1, obj2) {
    var result = {};
    for(key in obj1) {
        if(obj2[key] != obj1[key]) result[key] = obj2[key];
        if(typeof obj2[key] == 'array' && typeof obj1[key] == 'array') 
            result[key] = arguments.callee(obj1[key], obj2[key]);
        if(typeof obj2[key] == 'object' && typeof obj1[key] == 'object') 
            result[key] = arguments.callee(obj1[key], obj2[key]);
    }
    return result;
}

Tests: http://jsfiddle.net/gartz/Q3BtG/2/ http://jsfiddle.net/gartz/Q3BtG/2/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取两个 json 对象的差异 的相关文章

  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 使用 Rails 中的 postgres json 字段更新嵌套键

    我一直在尝试更新以下内容 boxes book 2 moving 2 goods to boxes book new 2 moving 2 goods 无需使用正则表达式或在 ruby 中执行此操作 但似乎有点棘手 我想添加新密钥 然后删除
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • iphone jquery 移动闪烁问题

    我在 iPhone 上使用使用 jQuery mobile 开发的应用程序时遇到闪烁问题 我尝试了互联网上提供的几种解决方案 包括 CSS 更改 将过渡设置为 无 甚至在 jquerymobile js 中注释代码 但没有运气 我使用的 J
  • .removeClass 从所有元素(相对于单个定义的元素)

    我将如何使用 removeClass 删除所有匹配的类 而不是单独调用每个元素 所以代替这个 input removeClass CO form alert select removeClass CO form alert input se
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • Angular 4 Http POST 不起作用

    我希望每个人都做得很好 我最近开始使用 Angular 4 4 我一直在尝试将数据发布到我的 api 服务器 但不幸的是它不起作用 我花了大约两天的时间 但仍然没有成功 甚至已经尝试过 6 7 篇文章角 io https angular i
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 后退按钮 (Chrome) 在 Play Framework 中获取 Json 而不是 HTML

    各位 我有一个 Web 应用程序 我在其中对同一资源的 JSON 和 HTML 表示重复使用了相同的路由 现在我们将其称为 foo details 该页面是从 bar details 链接的 因此 查看 bar details 您会看到链接
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • 在反应中访问回调内的 event.target

    我有以下课程片段 constructor props super props this timeout null search e gt clearTimeout this timeout this timeout setTimeout f
  • WordPress 子主题包括包含文件

    我在一家WordPress使用 AMPPS 作为本地主机在我的本地计算机上进行设置 使用 Delta 主题 我创建了一个子主题 delta2 child 初始设置效果很好 但是 我需要更改包含文件夹中名为 home slider php 的
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • 如何在 React Native 中使用相同的 Firebase 数据库在两个应用程序之间进行通信?

    我有两个不同的应用程序使用相同的实时数据库 在第一个应用程序中 我发送的订单包含一些要保存在数据库中的数据字段 在另一个应用程序中 我只添加一个侦听器 firebase database ref userOrder currentUser
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐

  • 来自 nginx API 端点的响应“No Access-Control-Allow-Origin”

    我收到的错误似乎是 CORS 问题 我正在尝试通过以下方式向我的 RESTful API 发出 POST 请求HttpClient如下 import Component OnInit from angular core import Obs
  • ITMS-90429:无效的 Swift 支持 - 文件 libswiftDarwin.dylib、libswiftMetal.dylib、

    当我想在 Appstore Connect 上发布我的存档时 我遇到了 Xcode 12 3 swift 5 和 cocoapods 1 10 1 版本的问题 一切都很顺利 但是一旦应用程序发送 我就会收到一封来自 App Store Co
  • 如何初始化标头中的静态成员[重复]

    这个问题在这里已经有答案了 给定的是一个具有静态成员的类 class BaseClass public static std string bstring 字符串显然必须是默认初始化课堂之外 std string BaseClass bst
  • 在 Python pandas 中拆分和连接数据帧以使用 rpy2 进行绘图

    我有一个关于 Python 中的 pandas 数据框的问题 我有一个大数据框df我分成两个子集 df1 and df2 df1 and df2加在一起并不能构成全部df 它们只是它的两个互斥的子集 我想用 rpy2 在 ggplot 中绘
  • JavaScript 中的连接

    由于某种原因 当 keyText 变量应该连接关键字中的每个变量时 它没有显示任何值 当有人单击该按钮时 它会运行 addKeyword 并获取输入的值 尝试 Console Log keyText 变量 但根本不起作用 var keywo
  • SQLLocalDB.exe 信息 - 返回错误代码 15100 等

    我正在尝试解决 LocalDB 的版本问题 命令 sqllocaldb i 似乎有效 C WINDOWS system32 gt sqllocaldb i MSSQL本地数据库 项目V12 但是 当我要求特定的内容时 我只得到错误 我使用的
  • scipy-cluster 定制生成的树状图

    这是后续scipy cluster 生成的树状图不显示 https stackoverflow com q 2967858 188368 from matplotlib pyplot import show from scipy spati
  • 通过html和javascript将文件上传到远程服务器

    我正在尝试通过基于 UNIX 的服务器中的 html 页面上传文件 但我不知道如何在远程服务器上获取文件并在那里保存文件 我写了下面的代码请帮我连接它
  • Firebase 身份验证在 1 小时后过期

    我能够允许用户使用电子邮件和密码登录 Firebase 我按照以下说明进行操作 https firebase google com docs reference rest auth section sign in email passwor
  • 到底什么是“对齐指针”?

    有人可以告诉我什么是对齐指针实际上意味着什么 这意味着所指向的地址可以被某个因子整除 有时使用术语 自然对齐 这通常意味着具有自然对齐的对象需要放置在可被对象大小整除的地址处 对齐有时非常重要 因为许多与硬件相关的事物都对这种对齐设置了限制
  • 如何为不同的页面加载不同的css?

    我正在尝试为我的页面创建不同的样式表 我有一个设置的头文件 然后我就有了我的主体页面 我将有main html project html contact html etc php load different pages for my bo
  • 如何获取未保存的脚本选项卡

    我想知道是否可以在 R studio 中获取未保存的脚本选项卡 我不小心打开并切换到新项目 然后我未保存的脚本消失了 任何人都可以帮助获取我未保存的脚本选项卡 如果您使用的是 Windows 请转到文件夹 C Users your user
  • 使用 DBIx::Class::ResultSet 的 find_or_create 方法时如何避免竞争条件?

    从文档中find or create http search cpan org arodland DBIx Class 0 08196 lib DBIx Class ResultSet pm find or create 注意 因为find
  • 检查图像是否彩色

    我想弄清楚图像是否是彩色的 在this https stackoverflow com questions 2150504 how can i check the color depth of a bitmapStackOverflow问题
  • Flexbox/IE11:flex-wrap:换行不换行(里面有图像+ Codepen)

    我创建了一个包含社交图标的列表 这些图标应该在小屏幕上环绕 I use flex wrap wrap 它在 Firefox 和 Chrome 中完美运行 但 Internet Explorer 11 和 IE 10 不会打破界限 Codep
  • Spring Data JPA:通过示例进行查询?

    使用 Spring Data JPA 我可以做举例查询 http docs jboss org hibernate orm 4 3 manual en US html ch17 html querycriteria examples其中特定
  • Varnish/Apache 随机 503 错误

    我在托管大约 30 个网站的 Rackspace 云服务器上运行 cPanel 我正在使用 Varnish 3 0 3 Apache 2 2 23 我收到随机 503 错误 如果我重新启动 httpd 进程 它们就会消失 我检查了 Apac
  • 当选择为 textView 和 editText 添加边框形状时,

    我想创建一个边框形状TextView and EditText 并在出现时显示view is selected 就像这个picture 您应该使用可绘制选择器来实现您的 UI 首先创建一个background edit text defau
  • Sidekiq 列出所有作业 [已排队 + 正在运行]

    有没有办法获取当前在队列中并正在运行的所有作业的列表 基本上 我想知道给定班级的工作是否已经存在 我不想插入我的其他工作 我见过其他选择 但我想这样做 我可以看到here https github com mperham sidekiq w
  • 获取两个 json 对象的差异

    场景 我想要一个比较两个 JSON 对象的函数 并返回一个包含差异列表的 JSON 对象 如果可能的话还返回更多数据 例如覆盖率指标 var madrid type team description Good trophies ucl 10