当前位置: 首页 > 面试题库 >

获取两个JSON对象的差异

侯博裕
2023-03-14
问题内容

场景:我想要一个比较两个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"}]};

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

有人知道解决方案吗?我已经找到了一个插件,但是我想知道是否还有其他选择。


问题答案:

可以使用通过对象键进行迭代的递归函数。然后使用Object.is测试NaNnull。然后测试如果第二对象是流延到该类型false喜欢0NaNnull。列出两个对象的键并将它们连接起来以测试中缺少的键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/

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

编辑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;
}

测试:http://jsfiddle.net/gartz/Q3BtG/2/



 类似资料:
  • 问题内容: 我使用以下代码在Android中使用Gson比较了两个JSON对象: 有两种方法可以使用Gson以JSON格式获取两个对象之间的 差异 吗? 问题答案: 如果将对象反序列化为,也可以使用Guava,则可以用来比较两个生成的地图。 请注意,如果您关心元素的 顺序 ,则不会保留s 字段的顺序,因此此方法不会显示这些比较。 这是您的操作方式: 该程序输出: 在此处阅读更多有关结果对象包含哪些

  • 问题内容: ‘Go’的新手。问题可能是最基本的问题。 我有两个time.Time对象,我想获得小时/分钟/秒这两者之间的差异。可以说: 在上述情况下,由于差为0。应该给我00:00:00。考虑另一种情况: 在这种情况下,差异将为00:05:41。我看了看https://godoc.org/time,但什么都做不了。 问题答案: 您可以用来获取2个值之间的差,结果将是的值。 打印时,格式本身会“智能

  • 我正在设置闹钟的日历日期。闹钟时间设置了小时、分钟、格式和日期。我还想抓住现在的时间,比较两者之间的差异。所以,如果闹钟时间设置为周三,现在时间是周四,我想知道周四到周三之间有多少天。我还需要时间和分钟。 我尝试过每一个例子,但似乎都不管用。 JAVA方法 我确实尝试过这个。 这只是不太正确。它说是2天,所以我假设它是从闹钟日(星期二)到星期四(今天)。我需要的是从今天(星期四)到星期二。从现在起

  • 问题内容: 我有以下输入-2个json文件,一个是基础文件,第二个包含相同的属性,但值不同,我想合并这些对象。 例如: 第二个文件: 结果应该是这样的: 使用powershell可以做到吗? 问题答案: (请参见下面的更新) 结果: 您可能会考虑不覆盖左值: 在这种情况下,结果将是: 更新2019年11月16日 的参数已经被耗尽,分过和参数(遗憾的重大更改)。好消息是,对象合并的默认参数设置包含在

  • 问题内容: 我有两个具有相同结构的JSON对象,我想使用Javascript将它们连接在一起。是否有捷径可寻? 问题答案: 根据注释中的描述,您只需执行一个数组concat:

  • 问题内容: 我有一个AJAX请求返回的json对象,而我遇到了一些麻烦,因为它一直在返回。只想知道我是否使用正确: 它们都是有效对象,即使它们都返回。 更新: 返回了JSON对象的示例: 问题答案: 你可以用这样的东西