javascript - 使用 Javascript 比较嵌套对象并保存新对象中的差异

标签 javascript json angular typescript object

我有两个 Javascript 对象

var order1 = {
    sandwich: 'tuna',
    chips: true,
    drink: 'soda',
    order: 1,
    toppings: [{VendorNumber: 18, PreferredFlag: false, SupportedFlag: true}, {VendorNumber: 19, PreferredFlag: false, SupportedFlag: true}, {VendorNumber: 20, PreferredFlag: false, SupportedFlag: true}],
    details: {
        name: 'Chris',
        phone: '555-555-5555',
        email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f59b9ab5819d949b9e8c9a80db969a98" rel="noreferrer noopener nofollow">[email protected]</a>'
    },
    otherVal1: '1'
};

var order2 = {
    sandwich: 'turkey',
    chips: true,
    drink: 'soda',
    order: 2,
    toppings: [{VendorNumber: 18, PreferredFlag: false, SupportedFlag: true}, {VendorNumber: 19, PreferredFlag: false, SupportedFlag: false}, {VendorNumber: 20, PreferredFlag: true, SupportedFlag: true}],
    details: {
        name: 'Jon',
        phone: '(555) 555-5555',
        email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="afd6cadcefdfc3cacedcca81ccc0c2" rel="noreferrer noopener nofollow">[email protected]</a>'
    },
    otherVal1: '2'
};

我需要的是比较这两个对象(order1 是现有的,order2 是编辑后的数据)并将差异存储在名为 var order3 的新变量中。但是,如果对象内部有一个数组,例如要随更改一起复制的浇头数组。

简而言之,结果应该是

{
  details: {
    email: "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="126b776152627e777361773c717d7f" rel="noreferrer noopener nofollow">[email protected]</a>",
    name: "Jon",
    phone: "(555) 555-5555"
  },
  order: 2,
  otherVal1: "2",
  sandwich: "turkey",
  toppings: [{
  PreferredFlag: false,
  SupportedFlag: true,
  VendorNumber: 18
}, {
  PreferredFlag: false,
  SupportedFlag: false,
  VendorNumber: 19
}, {
  PreferredFlag: true,
  SupportedFlag: true,
  VendorNumber: 20
}]
}

我怎样才能实现这个目标?

最佳答案

这正是您想要的:

function diff(tgt, src) {

    if (Array.isArray(tgt)) { // if you got array
        return tgt; // just copy it
    }

    // if you got object
    var rst = {};
    for (var k in tgt) { // visit all fields
        if (typeof src[k] === "object") { // if field contains object (or array because arrays are objects too)
            rst[k] = diff(tgt[k], src[k]); // diff the contents
        } else if (src[k] !== tgt[k]) { // if field is not an object and has changed
            rst[k] = tgt[k]; // use new value
        }
        // otherwise just skip it
    }
    return rst;
}
console.log(diff(order2, order1));

关于javascript - 使用 Javascript 比较嵌套对象并保存新对象中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085000/

相关文章:

javascript - Jquery数据表不显示列标题

javascript - 更新对象多维数组的值

java - 我想使用 json 将 Listview 数据发送到 Android 中的另一个 Activity

android - 删除带有 header 和参数的请求 Volley

javascript - Angular 4 不向服务器发送 cookie

angular - 在组件之间导航时保​​持路线一致

javascript - 如何在 typescript 中导出类型,它将类型标记为未定义

javascript - 没有 anchor 的可点击链接

javascript - 如何在 CryptoJS(nodejs/web 浏览器)中解密 AES 128

javascript - Angular 循环依赖解决方案