2012-02-26 52 views
10

Tôi có một cấu trúc như sau:Cập nhật thuộc tính đối tượng javascript?

skillet.person = { 
    name: { 
    first: '', 
    last: '' 
    }, 
    age: { 
    current: '' 
    }, 
    birthday: { 
    day: '', 
    month: '', 
    year: '' 
    } 
} 

tôi đã tự hỏi làm thế nào tôi sẽ cập nhật các giá trị? tức là tôi mặc dù những điều sau đây là chính xác

skillet.person.name.push({ first: 'blah', last: 'ha'}); 

nhưng điều đó sai? Làm thế nào tôi có thể sửa lỗi này ?

+4

MDN có một hướng dẫn JavaScript tuyệt vời, đặc biệt là https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects –

Trả lời

15

Nếu bạn muốn kết hợp một đối tượng vào một đối tượng khác, bạn có thể sử dụng chức năng mở rộng sâu của jQuery. "Sâu" có nghĩa là nó không ghi đè lên name với đối tượng mới, nhưng thay vào đó sẽ ghi đè các thuộc tính bên trong một đối tượng như vậy.

$.extend(true, skillet.person, { 
    name: { 
    first: 'updated' 
    }, 
    birthday: { 
    day: 'updated', 
    year: 'updated' 
    } 
}); 

Hiện tại, skillet.person có các thuộc tính thích hợp được cập nhật, trong khi các thuộc tính khác bị ảnh hưởng.

+0

yep! cảm ơn tuyệt vời :) đó là những gì tôi đang tìm kiếm – Andy

13
skillet.person.name.first = "blah" 
skillet.person.name.last = "ha" 

hoặc

skillet.person.name = {first : "blah", last : "ha"} 
+0

cảm ơn cho câu trả lời. là có một cách nhanh hơn để cập nhật thay vì liệt kê mỗi và mọi giá trị nếu tôi không muốn thay thế các tài sản nếu không phải tất cả các giá trị có sẵn? – Andy

+1

@Andy: Bạn có thể đang tìm kiếm hàm 'mở rộng'. [Xem Underscore.js để triển khai.] (Http://documentcloud.github.com/underscore/#extend) – pimvdb

+0

@pimvdb - vâng tại thời điểm này tôi có một đống thuộc tính nhưng không phải tất cả đều chứa giá trị. Tôi đã thay thế các đối tượng chỉ có một phần thích hợp và nó đã gây ra một prob - điều này có nghĩa là tôi phải liệt kê mỗi giá trị như MrE đã làm hoặc là có một cách nhanh hơn mà không cần thay thế? – Andy

4

push là một phương pháp Array s có thêm một mục mới vào một mảng.

Nếu bạn muốn thay thế các giá trị sau đó:

skillet.person.name = { … }; 

Nếu bạn muốn lưu trữ nhiều (full) tên trong đối tượng, sau đó bạn sẽ cần tài sản để tổ chức một mảng các đối tượng thay vì một đối tượng duy nhất.

+0

cảm ơn là có một cách nhanh hơn để cập nhật thay vì liệt kê mỗi và mọi giá trị nếu tôi không muốn thay thế? – Andy

+2

@Andy: Bạn có thể lặp qua các thuộc tính đối tượng. 'for (var prop trong newValues) {oldValues ​​[prop] = newValues ​​[prop];}' (trong một ý chính). MDN cũng có một trang tốt về 'for ... in'. Có một cái nhìn vào nó. –

Các vấn đề liên quan