2012-03-26 16 views
9

Có cách nào hiệu quả để sao chép một đối tượng chưa loại bỏ các thuộc tính được chỉ định không? Lý tưởng nhất là không viết lại hàm $ .extend?

var object = { 
    "foo": "bar" 
    , "bim": Array [1000] 
}; 

// extend the object except for the bim property 
var clone = $.extend({}, object, "bim"); 
// = { "foo":"bar" } 

Mục tiêu của tôi là tiết kiệm tài nguyên bằng cách không sao chép nội dung tôi sẽ không sử dụng.

+1

Còn về việc mất các thuộc tính đó thì sao? –

+0

Tôi có thể làm điều đó, nó chỉ là tôi không muốn lãng phí thời gian và tài nguyên sao chép tài sản. Ví dụ, nếu giá trị cho một thuộc tính nào đó là một mảng lớn thì tôi không muốn sao chép nó cả. – stinkycheeseman

Trả lời

9

jQuery.extend có số lượng đối số vô hạn, vì vậy bạn không thể viết lại để phù hợp với định dạng được yêu cầu của mình mà không có chức năng vi phạm.

Bạn có thể, tuy nhiên, dễ dàng loại bỏ các tài sản sau khi mở rộng, sử dụng delete điều hành:

var object = { 
    "foo": "bar" 
    , "bim": "baz" 
}; 

// extend the object except for the bim property 
var clone = $.extend({}, object); 
delete clone.bim; 
// = { "foo":"bar" } 
+0

Ah, vậy không có cách nào để kìm nén một tài sản nào đó? Tôi đang cố gắng không dành quá nhiều thời gian/tài nguyên sao chép những thứ tôi sẽ không sử dụng. – stinkycheeseman

+2

@stinkycheeseman Không phải không cần tạo triển khai mới. Đây là mã nguồn được chú thích của 'jQuery.extend', trong trường hợp bạn quan tâm: http://james.padolsey.com/jquery/#v=git&fn=jQuery.extend –

+0

Tôi có cùng yêu cầu chỉ vì băm chứa" cha mẹ ", và cha mẹ một lần nữa chỉ lại cho trẻ em, và nó đi trong vòng lặp vô hạn vì vậy tôi cũng muốn tránh một phím như" cha mẹ "trong khi nó thực hiện bản sao sâu –

0

Bạn có thể lưu trữ những gì bạn muốn với một trong hai pick hoặc omit từ underscore, cả hai đều cho phép tạo một bản sao của một đối tượng và lọc các khóa nhất định từ đối tượng nguồn được bao gồm hoặc bỏ qua trong bản sao/bản sao:

var object = { 
    "foo": "bar" 
    , "bim": Array [1000] 
}; 

// copy the object and omit the desired properties out 
// _.omit(sorceObject, *keys) where *keys = key names separated by coma or an array of keys 
var clone = _.omit(object, 'bim'); 
// { "foo":"bar" } 
Các vấn đề liên quan