ฉันมีสองวัตถุ: และoldObj
newObj
ข้อมูลที่oldObj
ใช้ในการเติมแบบฟอร์มและnewObj
เป็นผลมาจากการที่ผู้ใช้เปลี่ยนข้อมูลในแบบฟอร์มนี้และส่งมัน
วัตถุทั้งสองอยู่ลึกเช่น พวกเขามีคุณสมบัติที่เป็นวัตถุหรืออาร์เรย์ของวัตถุ ฯลฯ - พวกเขาสามารถอยู่ในระดับ n ลึกดังนั้นอัลกอริทึม diff จะต้องเรียกซ้ำ
ตอนนี้ฉันต้องไม่เพียงแค่คิดออกว่ามีการเปลี่ยนแปลงอะไร (เช่นในเพิ่ม / ปรับปรุง / ลบ) จากoldObj
ถึงnewObj
แต่ยังวิธีที่ดีที่สุดแทน
จนถึงตอนนี้ความคิดของฉันคือการสร้างgenericDeepDiffBetweenObjects
วิธีการที่จะคืนค่าวัตถุในแบบฟอร์ม{add:{...},upd:{...},del:{...}}
แต่ฉันก็คิดว่า: คนอื่นต้องมีสิ่งนี้มาก่อน
ดังนั้น ... ไม่มีใครรู้ของห้องสมุดหรือชิ้นส่วนของรหัสที่จะทำเช่นนี้และอาจมีวิธีที่ดีกว่าในการเป็นตัวแทนของความแตกต่าง
ปรับปรุง:
ฉันคิดว่าวิธีที่ดีกว่าในการแสดงข้อมูลที่อัปเดตโดยใช้โครงสร้างวัตถุเดียวกับnewObj
แต่เปลี่ยนค่าคุณสมบัติทั้งหมดเป็นวัตถุในแบบฟอร์ม:
{type: '<update|create|delete>', data: <propertyValue>}
ดังนั้นถ้าnewObj.prop1 = 'new value'
และoldObj.prop1 = 'old value'
มันจะตั้งreturnObj.prop1 = {type: 'update', data: 'new value'}
อัปเดต 2:
มันมีขนดกอย่างแท้จริงเมื่อเราไปถึงคุณสมบัติที่เป็นอาร์เรย์เนื่องจากอาร์เรย์[1,2,3]
ควรถูกนับเท่ากับ[2,3,1]
ซึ่งง่ายพอสำหรับอาร์เรย์ของชนิดที่มีค่าตามตัวอักษรเช่นสตริง int & bool แต่ยากที่จะจัดการเมื่อมันมาถึง อาร์เรย์ของประเภทการอ้างอิงเช่นวัตถุและอาร์เรย์
ตัวอย่างอาร์เรย์ที่ควรมีค่าเท่ากัน:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
ไม่เพียงมีความซับซ้อนในการตรวจสอบความเท่ากันของค่าลึกเช่นนี้เท่านั้น แต่ยังต้องหาวิธีที่ดีในการแสดงการเปลี่ยนแปลงที่อาจเกิดขึ้น
newObj
สร้างขึ้นโดยค่าการอ่านโค้ด js จากแบบฟอร์มใน DOM มีหลายวิธีในการรักษาสถานะและทำสิ่งนี้ได้ง่ายกว่ามาก แต่ฉันต้องการทำให้ไร้สัญชาติเป็นการออกกำลังกาย นอกจากนี้ฉันกำลังมองหางานศิลปะก่อนหน้าเพื่อดูว่าคนอื่น ๆ อาจจะจัดการกับเรื่องนี้ได้อย่างไรถ้าใครมี