为了账号安全,请及时绑定邮箱和手机立即绑定

javascript 中两个 JSON 的类似 git 的简单差异

javascript 中两个 JSON 的类似 git 的简单差异

犯罪嫌疑人X 2022-01-07 21:01:18
所以让我们通过例子来展示它。我必须 JSON:{    "a": {        "b": 1,        "c": 2    },    "d": false,    "e": 15,    "f": "something important"}和{    "a": {        "b": 1,        "c": 22    },    "d": false,    "e": "fifteen",    "g": "something new"}我想要的结果是:b: 2 => 22e: 15 => "fifteen"f(deleted)g(created) "something new"所以基本上我需要一个简单的差异来显示我从后端获得的模型中发生了什么变化,但我不确定我是否应该寻找一个库或者它是否足够简单以至于可以使用一个函数
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您也可以通过检查嵌套零件来检查零件并获得结果。


function getDifference(a, b) {

    return [...new Set([...Object.keys(a), ...Object.keys(b)])].reduce((r, k) => {


        if (a[k] && b[k] && typeof a[k] === 'object' && typeof b[k] === 'object') {

            var temp = getDifference(a[k], b[k]);

            if (temp.length) r.push(...temp.map(([l, ...a]) => [k + ' ' + l, ...a]));

            return r;

        }


        if (k in a && !(k in b)) {

            r.push([k, 'deleted', a[k]]);

            return r;

        }


        if (!(k in a) && k in b) {

            r.push([k, 'created', b[k]]);

            return r;

        }


        if (a[k] === b[k]) return r;


        r.push([k, 'changed', a[k], b[k]]);

        return r;

    }, []);

}




console.log(getDifference(

    { a: { b: 1, c: 2 }, d: false, e: 15, f: "something important" },

    { a: { b: 1, c: 22 }, d: false, e: "fifteen", g: "something new" }

));

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反对 回复 2022-01-07
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

获得差异

我认为这篇文章清楚地回答了你的问题。


查看完整回答
反对 回复 2022-01-07
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

也许你应该试试https://www.npmjs.com/package/deep-diff

真的很容易使用,并提供了一个详细的 diff 过滤方法和 diff 工具,比如批准或不批准更改。


查看完整回答
反对 回复 2022-01-07
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信