2016-08-15 56 views
6

Lazy-me tự hỏi liệu có cách nào tốt hơn để sao chép các thuộc tính trong một đối tượng (nguồn) sang đối tượng khác (đích) chỉ khi các thuộc tính tồn tại sau này? Nó không nhất thiết phải sử dụng dấu gạch dưới.Sao chép các thuộc tính từ một đối tượng này sang một đối tượng khác với điều kiện

Ví dụ,

_.mixin({ 
    assign: function (o, destination, source) { 
     for (var property in source) { 
      if (destination.hasOwnProperty(property)) { 
       destination[property] = source[property]; 
      } 
     } 
     return destination; 
    } 
}); 

console.log(_().assign({ a: 1, b: 2, d: 3 }, { a: 4, c: 5 })) // a: 4, b: 2, d: 3 

Trả lời

3

Một lựa chọn lười biếng là:

_.extend(a, _.pick(b, _.keys(a))); 

_.pick lọc nguồn đối tượng bằng .keys của điểm đến đối tượng và kết quả được sử dụng để mở rộng số destinati trên đối tượng.

Nếu bạn không muốn sửa đổi các đối tượng ban đầu, chỉ cần truyền một đối tượng trống đến hàm _.extend.

_.extend({}, a, _.pick(b, _.keys(a))); 
+1

Haha, ngắn hơn nhưng xấu xí. – Mikey

4

Sử dụng Object.assign(obj1, obj2); (nếu tài sản tồn tại sau này) mà có nguồn gốc trong ES6 (không underscore.js được yêu cầu).

Phương pháp Object.assign() được sử dụng để sao chép các giá trị của tất cả các tính riêng đếm được từ một hoặc nhiều đối tượng nguồn đến một mục tiêu đối tượng. Nó sẽ trả về đối tượng đích. More info here.

Ví dụ:

var o1 = { a: 1 }; 
 
var o2 = { b: 2 }; 
 
var o3 = { c: 3 }; 
 

 
var obj = Object.assign(o1, o2, o3); 
 
console.log(obj);

Hoặc sử dụng undescore.js

_.extend(destination, *sources)

hoặc

_.extendOwn(destination, *sources)

thông tin Detailated có thể được tìm thấy ở đây: http://underscorejs.org/#extend

+2

"... chỉ khi thuộc tính tồn tại sau". – undefined

+0

@Vohuman cảm ơn nhận xét của bạn Tôi đã chỉnh sửa ghi chú trong câu trả lời của tôi để tham khảo. – GibboK

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