2012-12-13 17 views
5

aşağıda örneğe bir bakalım iç içe özelliklere sahip nesneyi birleştirmek:JavaScript

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." 
    } 
}; 

Şimdi istediğim şey şudur:

  1. Birleştirme & özelliklerini nesneleri.

    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." 
        } 
    }; 
    

    denedim Ne: zaten ayarlanır EĞER

  2. ikinci nesnenin özelliklerini tutun (maxLength) Aşağıda

Ben bekliyoruz sonucudur

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; 
} 

Yukarıdaki işlev, birleştirir, ancak bir şekilde özellikleri yuvalamaz.

GÜNCELLEME & CEVAP o, ben de ikinci nesnesi aracılığıyla itterate unuttum, ne kadar aptal çalışma var. Teşekkür

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

Yalnızca Hiç çıkan nesne sadece hiç geçirilen ilk nesne olarak aynı anahtarlara sahip olacak, böylece firstObject' 'anahtarları üzerine yineleme ediyoruz. Sen edeceğiz de tuşların üzerinde yineleme gerekiyor secondObject' ve eksik olanları ekleyin. –

+1

@onlineracoon: Kodunuzu denedim ve özellikler doğru bir şekilde yuvalandı. Tek sorun, Anthony'nin belirttiği gibi bazı özelliklerin eksik olmasıdır. – RonaldBarzell

+0

@AnthonyGrist çalıştı, ne kadar aptalım lol. Ancak şimdi aldım: http://pastebin.com/Zma8kLY6 daha kısa yapılabilir, çoğaltılmış kod bir sürü im yapıyor gibi görünüyor – onlineracoon

cevap

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

Bu konuda bir kusur var. Bu, a = {a: {z: 1}, b: {y: 1}, c: {z: 1}} birleştirdiğimizde bu başarısız olur; b = {c: {zye: 1}}; Anahtarın, çağrıdaki ikinci nesnede olup olmadığını kontrol etmediğimizden: return mergeNestedObjects (firstObject [propertyKey], secondObject [propertyKey]) – Abhinav

1

Oldukça eski soruyu @AnthonyGrist, ama yararlı olabilir. Biraz özyineleme.

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);