2012-12-13 53 views
5

Cho phép hãy nhìn vào ví dụ dưới đây:Javascript sáp nhập đối tượng với thuộc tính lồng nhau

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

Bây giờ những gì tôi muốn đây là:

  1. Merge đối tượng & tài sản.
  2. Giữ các thuộc tính của đối tượng thứ hai NẾU họ được thiết lập rồi (maxLength)

Dưới đây là kết quả mà tôi mong đợi:

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

Những gì tôi đã cố gắng:

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

Hàm ở trên kết hợp nhưng bằng cách nào đó không lồng các thuộc tính.

CẬP NHẬT & TRẢ LỜI làm việc đó, tôi quên mất quá nhiều thông qua đối tượng thứ hai, làm thế nào câm. Nhờ @AnthonyGrist

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

Bạn chỉ bao giờ lặp qua các khóa của 'firstObject', vì vậy đối tượng kết quả của bạn chỉ bao giờ có các khóa giống như đối tượng đầu tiên được truyền. Bạn cũng sẽ cần phải lặp qua các phím của 'secondObject' và thêm những từ bị thiếu. –

+1

@onlineracoon: Tôi đã thử mã của bạn và thuộc tính được lồng chính xác. Vấn đề duy nhất là một số tài sản bị thiếu, như Anthony đã chỉ ra. – RonaldBarzell

+0

@AnthonyGrist đã làm việc, làm thế nào ngu ngốc của tôi lol. Bây giờ tuy nhiên tôi đã nhận này: http://pastebin.com/Zma8kLY6 nó có thể được thực hiện bất kỳ ngắn hơn, có vẻ như im làm rất nhiều mã trùng lặp – onlineracoon

Trả lời

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

Có một lỗ hổng trong việc này. Điều này không thành công khi chúng ta hợp nhất a = {a: {z: 1}, b: {y: 1}, c: {z: 1}}; b = {c: {zye: 1}}; Vì chúng tôi không kiểm tra xem khóa có tồn tại trong đối tượng thứ hai trong cuộc gọi hay không: return mergeNestedObjects (firstObject [propertyKey], secondObject [propertyKey]) – Abhinav

1

câu hỏi Khá cũ, nhưng có thể hữu ích. Một chút đệ quy.

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); 
Các vấn đề liên quan