2012-12-13 14 views
5

नीचे दिए गए उदाहरण पर एक नज़र लेते हैं:जावास्क्रिप्ट नेस्टेड गुणों के साथ वस्तु विलय

var ref = { 
    "fullName": { 
     "rules": { 
      "type": "string", 
      "minLength": 4, 
      "maxLength": 64 
     }, 
     "description": "Full name of a user." 
    } 
}; 

var user = { 
    "fullName": { 
     "rules": { 
      "required": true, 
      "maxLength": 128 
     }, 
     "message": "You have submitted a wrong full name." 
    } 
}; 

अब क्या मैं चाहता हूँ यह है:

  1. मर्ज वस्तुओं & गुण।
  2. दूसरी वस्तु के गुणों रखें वे पहले से ही स्थापित कर रहे हैं IF (maxLength)

नीचे परिणाम है कि मैं उम्मीद:

var res = { 
    "fullName": { 
     "rules": { 
      "required": true, 
      "maxLength": 128 
      "type": "string", 
      "minLength": 4 
     }, 
     "description": "Full name of a user.", 
     "message": "You have submitted a wrong full name." 
    } 
}; 

मैं क्या कोशिश की है:

function mergeNestedObjects(firstObject, secondObject) { 
    var finalObject = {}; 

    for (var propertyKey in firstObject) { 
     var propertyValue = firstObject[propertyKey]; 

     if (typeof(propertyValue) === "object") { 
      finalObject[propertyKey] = mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]); 
     } else if (secondObject[propertyKey] === undefined) { 
      finalObject[propertyKey] = firstObject[propertyKey]; 
     } else { 
      finalObject[propertyKey] = secondObject[propertyKey]; 
     } 
    } 

    return finalObject; 
} 

उपरोक्त कार्य विलीन हो जाता है लेकिन किसी भी तरह से गुणों को घोंसला नहीं करता है।

अद्यतन & उत्तर यह काम कर रहा है, मैं भी दूसरी वस्तु के माध्यम से itterate, कैसे गूंगा भूल गया। धन्यवाद

function mergeProperties(propertyKey, firstObject, secondObject) { 
    var propertyValue = firstObject[propertyKey]; 

    if (typeof(propertyValue) === "object") { 
     return mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]); 
    } else if (secondObject[propertyKey] === undefined) { 
     return firstObject[propertyKey]; 
    } 

    return secondObject[propertyKey]; 
} 

function mergeNestedObjects(firstObject, secondObject) { 
    var finalObject = {}; 

    // Merge first object and its properties. 
    for (var propertyKey in firstObject) { 
     finalObject[propertyKey] = mergeProperties(propertyKey, firstObject, secondObject); 
    } 

    // Merge second object and its properties. 
    for (var propertyKey in secondObject) { 
     finalObject[propertyKey] = mergeProperties(propertyKey, secondObject, firstObject); 
    } 

    return finalObject; 
} 
+2

आप केवल कभी भी 'firstObject' की चाबियाँ पर पुनरावृत्ति कर रहे हैं, तो अपने जिसके परिणामस्वरूप वस्तु ही कभी पहली वस्तु में पारित रूप में एक ही कुंजी है करने के लिए जा रहा है। आप करेंगे चाबियाँ पर पुनरावृति करने की आवश्यकता है 'secondObject' का, और जो लापता हैं उन्हें जोड़ें। –

+1

@onlineracoon: मैंने आपके कोड की कोशिश की, और गुण सही ढंग से घोंसला। एकमात्र मुद्दा यह है कि कुछ संपत्तियां गायब हैं, क्योंकि एंथनी ने बताया। – RonaldBarzell

+0

@ एंथनी ग्रिस्ट ने काम किया, मेरे बारे में कितना बेवकूफ। हालांकि मुझे यह मिला: http://pastebin.com/Zma8kLY6 इसे किसी भी छोटे से बनाया जा सकता है, ऐसा लगता है कि मैं डुप्लीकेट कोड – onlineracoon

उत्तर

6
function mergeProperties(propertyKey, firstObject, secondObject) { 
    var propertyValue = firstObject[propertyKey]; 

    if (typeof(propertyValue) === "object") { 
     return mergeNestedObjects(firstObject[propertyKey], secondObject[propertyKey]); 
    } else if (secondObject[propertyKey] === undefined) { 
     return firstObject[propertyKey]; 
    } 

    return secondObject[propertyKey]; 
} 

function mergeNestedObjects(firstObject, secondObject) { 
    var finalObject = {}; 

    // Merge first object and its properties. 
    for (var propertyKey in firstObject) { 
     finalObject[propertyKey] = mergeProperties(propertyKey, firstObject, secondObject); 
    } 

    // Merge second object and its properties. 
    for (var propertyKey in secondObject) { 
     finalObject[propertyKey] = mergeProperties(propertyKey, secondObject, firstObject); 
    } 

    return finalObject; 
} 
+0

इसमें कोई दोष है। यह विफल रहता है जब हम एक = {a: {z: 1}, b: {y: 1}, c: {z: 1}} मर्ज करते हैं; बी = {सी: {zye: 1}}; चूंकि हम कॉल नहीं कर रहे हैं कि कॉल में दूसरी ऑब्जेक्ट में कुंजी मौजूद है: वापसी मर्ज करेंस्टेड ऑब्जेक्ट्स (firstObject [propertyKey], secondObject [propertyKey]) – Abhinav

1

सुंदर पुराने सवाल @AnthonyGrist के लिए, लेकिन उपयोगी हो सकता है। रिकर्सन का थोड़ा सा।

function mergeObjects(og, so) { 
    for (var key in so) { 
     if (typeof (og[key]) === 'object') { 
      mergeObjects(og[key], so[key]); 
     } else { 
      if (og[key] || typeof (og[key]) === 'boolean') { 
       og[key] = so[key]; 
      } 
     } 
    } 
    return og; 
} 

mergeObjects(ref, user); 
संबंधित मुद्दे