यहां मेरी समस्या का आंशिक, भरोसेमंद समाधान है - मैं इसे अद्यतन कर दूंगा क्योंकि मैं इसे और विकसित करता हूं।
function findDifferences(objectA, objectB) {
var propertyChanges = [];
var objectGraphPath = ["this"];
(function(a, b) {
if(a.constructor == Array) {
// BIG assumptions here: That both arrays are same length, that
// the members of those arrays are _essentially_ the same, and
// that those array members are in the same order...
for(var i = 0; i < a.length; i++) {
objectGraphPath.push("[" + i.toString() + "]");
arguments.callee(a[i], b[i]);
objectGraphPath.pop();
}
} else if(a.constructor == Object || (a.constructor != Number &&
a.constructor != String && a.constructor != Date &&
a.constructor != RegExp && a.constructor != Function &&
a.constructor != Boolean)) {
// we can safely assume that the objects have the
// same property lists, else why compare them?
for(var property in a) {
objectGraphPath.push(("." + property));
if(a[property].constructor != Function) {
arguments.callee(a[property], b[property]);
}
objectGraphPath.pop();
}
} else if(a.constructor != Function) { // filter out functions
if(a != b) {
propertyChanges.push({ "Property": objectGraphPath.join(""), "ObjectA": a, "ObjectB": b });
}
}
})(objectA, objectB);
return propertyChanges;
}
और यहाँ यह कैसे उपयोग किया जाएगा और डेटा यह प्रदान करेगा का एक नमूना है (कृपया लंबे उदाहरण बहाना है, लेकिन मैं अपेक्षाकृत गैर तुच्छ कुछ प्रयोग करना चाहते हैं):
var person1 = {
FirstName : "John",
LastName : "Doh",
Age : 30,
EMailAddresses : [
"[email protected]",
"[email protected]"
],
Children : [
{
FirstName : "Sara",
LastName : "Doe",
Age : 2
}, {
FirstName : "Beth",
LastName : "Doe",
Age : 5
}
]
};
var person2 = {
FirstName : "John",
LastName : "Doe",
Age : 33,
EMailAddresses : [
"[email protected]",
"[email protected]"
],
Children : [
{
FirstName : "Sara",
LastName : "Doe",
Age : 3
}, {
FirstName : "Bethany",
LastName : "Doe",
Age : 5
}
]
};
var differences = findDifferences(person1, person2);
Property
में
[
{
"Property":"this.LastName",
"ObjectA":"Doh",
"ObjectB":"Doe"
}, {
"Property":"this.Age",
"ObjectA":30,
"ObjectB":33
}, {
"Property":"this.EMailAddresses[1]",
"ObjectA":"[email protected]",
"ObjectB":"[email protected]"
}, {
"Property":"this.Children[0].Age",
"ObjectA":2,
"ObjectB":3
}, {
"Property":"this.Children[1].FirstName",
"ObjectA":"Beth",
"ObjectB":"Bethany"
}
]
this
: इस बिंदु पर, यहाँ क्या differences
सरणी की तरह अगर आप इसे JSON करने के लिए धारावाहिक लगेगा है मूल्य उस ऑब्जेक्ट की जड़ को संदर्भित करता है जिसकी तुलना की गई थी। तो, यह समाधान अभी तक बिल्कुल नहीं है जो मुझे चाहिए, लेकिन यह बहुत करीब है।
आशा है कि यह किसी के लिए उपयोगी होगा, और यदि आपके पास सुधार के लिए कोई सुझाव है, तो मैं सभी कान हूं; मैंने कल रात बहुत देर से लिखा (यानी आज सुबह) और ऐसी चीजें हो सकती हैं जो मैं पूरी तरह से देख रहा हूं।
धन्यवाद।
जेसन, धन्यवाद। मैं फिर भी अपना जवाब हटाने जा रहा हूँ। जाहिर है, यह वह नहीं है जिसके बाद आप कहां हैं, और कार्यान्वयन उस पर बहस योग्य है, इसलिए मुझे लगता है कि इसे रखने के लिए कोई मूल्य नहीं है। यदि आपके पास कोई समाधान है जो आपकी आवश्यकताओं के अनुरूप है तो मुझे इसे यहां देखना दिलचस्प लगेगा। – Tomalak
मुझे निराश है कि आपने इसे हटाने का फैसला किया है, लेकिन ऐसा करने के आपके अधिकार का सम्मान करें। मैंने बस सीखा है कि ऐसी चीजें हैं जिन्हें दूसरों के समाधानों के समाधानों से सीखा जा सकता है, भले ही वे उस सटीक समस्या को हल न करें जो उन्हें डिजाइन किया गया था। हम बस कुछ भी सीख सकते हैं। –