json - مقایسه اشیاء تو در تو و ذخیره تفاوتها در یک شیء جدید با استفاده از جاوااسکریپت
من دو شیء جاوااسکریپت دارم
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: '[email '
},
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: '[email '
},
otherVal1: '2'
};
آنچه من نیاز دارم این است که این دو شیء را مقایسه کنم (order1 موجود است و order2 داده ویرایش شده است) و تفاوت را در یک متغیر جدید به نام order3 ذخیره کنم. با این حال اگر یک آرایه داخل یک شیء وجود داشته باشد، مانند آرایه toppings، باید به صورت کامل همراه با تغییرات کپی شود.
به طور خلاصه نتیجه باید باشد
{
details: {
email: "[email ",
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));
پاسخ شماره ۲
فکر میکنم شما دنبال یک الگوریتم مقایسهای هستید. این تابع بازگشتی سریع را نوشتم که روی هر ویژگی قابل شمارش از شیء جاوااسکریپت شما (نه شیء JSON) تکرار میکند و برابری را آزمایش میکند. توجه داشته باشید که موقعیت آرگومانها بر خروجی تأثیر میگذارد.
function diff(obj1, obj2) {
if (typeof obj1 === "object") {
const obj = {};
for (const prop in obj1) {
if (diff(obj1[prop], obj2[prop])) {
obj[prop] = obj1[prop]
}
}
return obj
} else {
return obj1 !== obj2;
}
}
console.log(diff(order2, order1))
